我们使用的代码在包含大量 wait 和 notifyAll() 调用的代码段周围使用同步块(synchronized block)。我们正在尝试将它们转换为使用 Java 5 Lock.lock() 和 Lock.unlock() 方法。如何迁移此代码以删除所有 wait 和 notifyAll 调用。我不知道使用新的锁定功能与这些等效。
任何带有示例的链接将不胜感激。
提前致谢
等式,以下代码需要转换为使用 Lock.lock() 和 lock.unlock 删除同步块(synchronized block)的第一部分很简单,因为我只需要调用 lock() 方法。问题是可以为 notifyAll() 和 wait 方法做什么。
synchronized( LOCK ) { while( !Thread.interrupted() ) { try { working = runRules(); if( !working ) LOCK.notifyAll(); LOCK.wait( working ? shortTimeout : longTimeout ); } catch( final InterruptedException e ) { Package.log.info( "Thread was interrupted. Exiting.", e ); return; } } }
最佳答案
使用 Condition
s provided by the java.util.concurrent.locks
package :
final Object monitor = ...
...
synchronized (monitor) {
while (!condition) monitor.wait();
... do something ...
}
变成:
final ReentrantLock lock = ...;
final Condition cvar = lock.newCondition();
...
lock.lock();
try {
while (!condition) cvar.await();
... do something ...
} finally {
lock.unlock();
}
信号方面非常相似:
synchronized (monitor) {
... do something ...
monitor.notify();
}
变成:
lock.lock();
try {
... do something ...
cvar.signalAll();
} finally {
lock.unlock();
}
关于java - 将 wait 和 notifyAll 代码转换为使用 Java 1.5 Lock 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875437/