我们使用的代码在代码片段周围使用syncronized块,并使用大量wait和notifyAll()调用。我们试图将这些转换为使用Java 5 Lock.lock()和Lock.unlock()方法。如何迁移此代码以删除所有wait和notifyAll调用。我不知道这些使用新的锁定功能的等同物。转换wait&notifyAll代码以使用Java 1.5 Lock对象
任何与例子的链接将不胜感激。
由于提前
当量,需要下面的代码被转换为使用Lock.lock()和lock.unlock第一部分以除去同步块是简单,因为我只需要调用锁( ) 方法。问题是可以为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; } } }
如果你可以发布代码示例,你会得到更好的结果 - 在1.5中有很多并发基元。在例子之外给你的建议可能会给你错误的答案。 – 2011-05-03 20:47:16
感谢您的回复。我已添加您要求的代码段。 – Nadeem 2011-05-03 21:26:27
'ReentrantLock'比'synchronized'块更容易出错 - 很容易错过'finally'块。所以,除非你需要一些特殊的功能 - lockInterruptibly或tryLock - 否则转换代码没有意义。如果您决定将代码迁移到更新的API中,则应考虑重构代码以使用更高级别的API,如信号量,锁存器或障碍。 – 2011-05-03 22:46:40