synchronized vs ReentrantLock vs AtomicInteger执行时间

时间:2014-01-13 22:23:39

标签: java multithreading concurrency synchronization mutex

我可以看到ReentrantLocksynchronized快50%,AtomicInteger快100%。为什么这三种同步方法的执行时间存在差异:synchronized阻止,ReentrantLockAtomicInteger(或Atomic包中的任何类)。

除了这些方法之外还有其他流行的和扩展的同步方法吗?

3 个答案:

答案 0 :(得分:9)

影响这一点的因素很多。

  • Java的版本。对于ReentrantLock来说Java 5.0要快得多,而Java 7则不是那么多
  • 争用程度。同步效果最好(一般锁定),竞争率低。 ReentrantLock在更高的争用率下运行得更好。 YMWV
  • JIT可以做多少优化。 JIT优化以ReentrantLOck不同的方式进行同步。如果这是不可能的,你将看不到优势。
  • synchronized在其动作中没有GC。 ReentrantLock可以创建垃圾,使其变慢并根据其使用方式触发GC。

AtomicInteger使用与锁定使用相同的原语但执行忙等待。 CompareAndSet也称为CompareAndSwap,即它的功能更简单(并且更加有限)

ConcurrentXxxx,CopyOnWriteArrayXxxx系列非常受欢迎。这些提供并发性而无需直接使用锁(在某些情况下根本没有锁)

答案 1 :(得分:7)

AtomicInteger比硬件上的其他两种同步方法快得多,因为它是无锁的。在CPU提供无锁并发基本功能的体系结构中,AtomicInteger的操作完全在硬件中执行,关键操作通常只需要一条CPU指令。相比之下,ReentrantLocksynchronized使用多个指令来执行其任务,因此您会看到与它们相关的一些相当大的开销。

答案 2 :(得分:1)

我认为你在评估这3个要素进行比较时会犯一个常见的错误。

基本上,当ReentrantLock与同步密钥相比,在同步块时可以提供更大的灵活性。 Atomic采用基于CAS(比较和交换)的不同方法来管理并发上下文中的更新。

我建议你深入阅读Java平台的并发性。

Java Concurrency in Practice - Brian Göetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes & Doug Lea

对并发性有深入的了解,并且知道语言可以为解决并发性问题和利用多线程提供什么方面存在很大差异。

在性能方面,它取决于当前的情况。