通过在 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没有同步控制,因为它只是进行测试,我们希望它在任意时
刻都能被调用,这样它才能真正检查对象的状态。