我可以看到 ReentrantLock
比 synchronized
快 50% 左右,AtomicInteger
快 100%。为什么这三种同步方法的执行时间如此不同:synchronized
block 、ReentrantLock
和 AtomicInteger
(或 Atomic 中的任何类
包)。
除了这些之外,还有其他流行和扩展的同步方法吗?
最佳答案
影响这一点的因素有很多。
- Java 的版本。 Java 5.0 的 ReentrantLock 快得多,Java 7 没那么快
- 竞争程度。 synchronized 在争用率低的情况下效果最好(一般情况下锁定也是如此)。 ReentrantLock 在更高的争用率下工作得更好。 YMWV
- JIT 可以进行多少优化。 JIT 优化以 ReentrantLOck 不是的方式同步。如果这不可能,您将看不到优势。
- synchronized 在其操作中是免费的 GC。 ReentrantLock 会产生垃圾,这会使其变慢并根据其使用方式触发 GC。
AtomicInteger 使用与锁定相同的原语,但会进行忙等待。 CompareAndSet 也称为 CompareAndSwap,即它的功能要简单得多(也更受限制)
ConcurrentXxxx、CopyOnWriteArrayXxxx 集合非常流行。这些提供并发性而无需直接使用锁(在某些情况下根本不需要锁)
关于java - 同步 vs ReentrantLock vs AtomicInteger 执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102592/