繁体   English   中英

synchronized vs ReentrantLock vs AtomicInteger执行时间

[英]synchronized vs ReentrantLock vs AtomicInteger execution time

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

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

影响这一点的因素有很多。

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

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

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

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

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

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

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

Java并发实践--BrianGöetz,Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes和Doug Lea

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM