使用Java的内置并发机制与java.util.concurrent中提供的Utilities之间的权衡

时间:2011-03-28 08:19:15

标签: java concurrency

使用Java的内置并发机制与java.util.concurrent中提供的实用程序(例如Reentrant Locks)之间的权衡取舍

4 个答案:

答案 0 :(得分:4)

主要有两点不同:

  • java.util.concurrent类表示更高级别的抽象和经过测试的特定概念的实现。您可以使用同步来实现大多数或所有这些概念,但这将是更多的代码,更多的工作,以及更多,更容易出错。
  • 其中一些类基于原子硬件操作(比较和设置)而不是同步,这比在激烈(但不是极端)争用下的同步性能更好。

答案 1 :(得分:2)

这些想到了:

  1. “synchronized”功能是一种语言结构,具有用于进入和退出块的特殊流控制,而“util.concurrent”必须遵守任何其他对象的规则。这将给程序员带来一些认知负担。

  2. “util.concurrent”接口和实现可以定义它们自己的独特行为(例如公平性或单独的读/写锁定),因此在特定情况下可以提高性能。

  3. “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)。