Java Thread:(2) wait() and notify()
版本中需要注意的是getBusyFlag()
方法需要在循环中进行检查,如果采用如下方式,wait()
结束后直接进行获取,依然可能无法得到flag——
public synchronized void getBusyFlag() {
if (!tryGetBusyFlag()) {
try {
wait();
tryGetBusyFlag()
} catch (Exception e) {}
}
}
- 第一个线程获取到
busyflag
- 第二个线程调用
tryGetBusyFlag()
:返回false - 第二个线程执行
wait()
方法:释放同步锁 - 第一个线程进入
freeBusyFlag()
方法:获取到同步锁 - 第一个线程调用
notify()
方法 - 第三个线程尝试调用
getBusyFlag()
方法,等待获取到锁对象 - 第一个线程退出
freeBusyFlag()
方法,释放了锁对象 - 第三个线程获取到锁对象,进入
getBusyFlag()
方法。此时busyflag被释放,这第三线程获取到busgflag并退出getBusyFlag()
方法,同时释放锁 - 第二个线程收到了来自第一个线程的
notify
的通知,从wait()
方法返回并获取到同步锁 - 第二个线程再次调用
tryGetBusyFlag()
方法,busgflag被占有,再次进入wait
状态——如果采用上面的实现,这一步实际上无法获取到busyflag
网友评论