同步控制 EvenGenerator

来源:互联网 发布:随身带着淘宝去异界 编辑:程序博客网 时间:2024/06/01 09:06

通过在 EvenGenerator.java 中加入 synchronized关键字,我们就可以防止不希望

的线程访问:

 

//: c13:SynchronizedEvenGenerator.java

// Using "synchronized" toprevent thread collisions

 

public

class SynchronizedEvenGenerator             implements

Invariant {

private      int i;

public     synchronized      void next() { i++; i++; }

public     synchronized      int getValue() {           return i; }

// Not synchronized so it can run at

// any time and thus be a genuine test:

public InvariantState invariant() {

intval = getValue();

if(val% 2 == 0)

return      new InvariantOK();

else

return new InvariantFailure(newInteger(val));

  }

public     static       void main(String[] args) {

   SynchronizedEvenGenerator gen =

newSynchronizedEvenGenerator();

new InvariantWatcher(gen, 4000);               // 4-second

timeout

while(true)

     gen.next();

  }

///:~

 

你可以注意到next( )和getValue( )都使用了synchronized进行修饰。要是你只同

步控制其中一个方法的话,那么另一个就可以随意地忽略对象锁,从而出现不负责任的调

用。关键是:每个访问关键共享资源的方法必须全部是synchronized的,否则就会出错。

另一方面,InvariantState没有同步控制,因为它只是进行测试,我们希望它在任意时

刻都能被调用,这样它才能真正检查对象的状态。

原创粉丝点击