使用Java的内置并发机制与java.util.concurrent中提供的实用程序(例如Reentrant Locks)之间的权衡取舍
答案 0 :(得分:4)
主要有两点不同:
java.util.concurrent
类表示更高级别的抽象和经过测试的特定概念的实现。您可以使用同步来实现大多数或所有这些概念,但这将是更多的代码,更多的工作,以及更多,更容易出错。答案 1 :(得分:2)
这些想到了:
“synchronized”功能是一种语言结构,具有用于进入和退出块的特殊流控制,而“util.concurrent”必须遵守任何其他对象的规则。这将给程序员带来一些认知负担。
“util.concurrent”接口和实现可以定义它们自己的独特行为(例如公平性或单独的读/写锁定),因此在特定情况下可以提高性能。
“util.concurrent.atomic”类可以为compare-and-swap指令提供硬件级支持,这些指令可以启用无锁和无等待算法,这些算法在某些应用程序中可以有更好的性能。
答案 2 :(得分:1)
没有权衡,只有陷阱。
几乎没有人使用wait(),notify()和notifyAll()来实现并发控制,除非他们正在编写java.util.concurrent中不可用的一些构造。即使对于Doug Lea(Java并行编程和JSR-166规范的作者),也很难做到正确。
同步适用于简单的情况,但没有提供所需的粒度(多个读取器,单个编写器锁是单独同步不支持的东西,虽然你可以用它来实现信号量然后实现RW锁,但你会重新发明轮子)。
答案 3 :(得分:1)
synchronized
的优点:
synchronized
块(或方法)会更容易,而且你不能忘记unlock()
步骤。 Lock
的优点:
另一方面,对于显式Lock
个对象,您可以拥有非嵌套的受保护块 - 比如在迭代链表时,您可能总是希望锁定下一个列表元素并且仅在之后这解锁了前一个。
Lock对象允许阻止不可中断,阻止可中断和非阻塞获取锁,而同步块只允许阻止不可中断的阻塞。
还有其他Lock实现允许不同的锁定策略(如ReadWriteLock)。