【发布时间】:2011-08-18 00:58:57
【问题描述】:
我们使用在代码段周围使用同步块的代码,其中包含大量等待和 notifyAll() 调用。我们正在尝试将它们转换为使用 Java 5 Lock.lock() 和 Lock.unlock() 方法。如何迁移此代码以删除所有 wait 和 notifyAll 调用。我不知道这些使用新的锁定功能的等价物。
任何带有示例的链接将不胜感激。
提前致谢
等式,下面的代码需要转换为使用Lock.lock()和lock.unlock 删除同步块的第一部分很简单,我只需要调用lock()方法。问题是 notifyAll() 和 wait 方法可以做什么。
同步(锁定) { 而(!Thread.interrupted()) { 尝试 { 工作=运行规则(); 如果(!工作) LOCK.notifyAll(); LOCK.wait(工作?shortTimeout:longTimeout); } 捕获(最终中断异常 e) { Package.log.info("线程被中断。退出。", e); 返回; } } }【问题讨论】:
-
如果您可以发布代码示例,您将获得更好的结果——1.5 中有许多并发原语。在示例之外给你建议可能会给你错误的答案。
-
感谢您的回复。我已经添加了您要求的代码 sn-p。
-
ReentrantLocks 比synchronized块更容易出错 - 很容易错过finally块。因此,除非您需要某些特定功能 -lockInterruptibly或tryLock- 否则转换代码是没有意义的。如果您决定将代码迁移到更新的 API,则应考虑重构代码以使用更高级别的 API,例如Semaphores、Latches 或Barriers。 -
@Binil - 除了您对 Semaphore 的引用之外,我同意一切。我会认为 Semaphore 与 Lock 和 wait/notify 的 API“级别”相同。
标签: java multithreading concurrency thread-safety