同步控制 EvenGenerator

通过在 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没有同步控制,因为它只是进行测试,我们希望它在任意时

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值