我可以看到ReentrantLock
比synchronized
快50%,AtomicInteger
快100%。为什么这三种同步方法的执行时间存在差异:synchronized
阻止,ReentrantLock
和AtomicInteger
(或Atomic
包中的任何类)。
除了这些方法之外还有其他流行的和扩展的同步方法吗?
答案 0 :(得分:9)
影响这一点的因素很多。
AtomicInteger使用与锁定使用相同的原语但执行忙等待。 CompareAndSet也称为CompareAndSwap,即它的功能更简单(并且更加有限)
ConcurrentXxxx,CopyOnWriteArrayXxxx系列非常受欢迎。这些提供并发性而无需直接使用锁(在某些情况下根本没有锁)
答案 1 :(得分:7)
AtomicInteger
比硬件上的其他两种同步方法快得多,因为它是无锁的。在CPU提供无锁并发基本功能的体系结构中,AtomicInteger
的操作完全在硬件中执行,关键操作通常只需要一条CPU指令。相比之下,ReentrantLock
和synchronized
使用多个指令来执行其任务,因此您会看到与它们相关的一些相当大的开销。
答案 2 :(得分:1)
我认为你在评估这3个要素进行比较时会犯一个常见的错误。
基本上,当ReentrantLock与同步密钥相比,在同步块时可以提供更大的灵活性。 Atomic采用基于CAS(比较和交换)的不同方法来管理并发上下文中的更新。
我建议你深入阅读Java平台的并发性。
对并发性有深入的了解,并且知道语言可以为解决并发性问题和利用多线程提供什么方面存在很大差异。
在性能方面,它取决于当前的情况。