synchronized vs ReentrantLock vs AtomicInteger执行时间

dab*_*aba 5 java concurrency multithreading synchronization mutex

我可以看到,ReentrantLock快于50%左右synchronized,并AtomicInteger快100%.为什么这三种同步方法的执行时间存在差异:synchronizedReentrantLockAtomicInteger(或Atomic包中的任何类).

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

Pet*_*rey 9

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

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

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

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


das*_*ght 7

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