java - 同步 vs ReentrantLock vs AtomicInteger 执行时间

标签 java multithreading concurrency synchronization mutex

我可以看到 ReentrantLocksynchronized 快 50% 左右,AtomicInteger 快 100%。为什么这三种同步方法的执行时间如此不同:synchronized block 、ReentrantLockAtomicInteger(或 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/

相关文章:

java - 编写注释以防止参数无效时调用方法

java - 什么是 "Sim blocking"(在 tomcat 文档中看到)?

ios - 记录方法正在哪个队列/线程上运行

java - 编译时检查或 java.util.ConcurrentModificationException

Java并发尝试加锁

java android 创建事件

java - 如何在 Intellij IDEA 中使用 gradle run?

java - 浮点精度在实际例子中到底如何工作?

java - 管理执行同一任务的线程的最合适方法是什么?

使用特定对象引用的 Java 同步块(synchronized block)