ReentrantLock与CPU级别同步?

时间:2016-04-02 08:46:02

标签: java concurrency

' ReentrantLock'之间是否存在差异?和'同步'如何在CPU级别实现? 或者他们使用相同的CAS'接近?

2 个答案:

答案 0 :(得分:9)

如果我们谈论的是ReentrantLock vs synchronized(也称为"内在锁定"),那么查看Lock documentation是个好主意:

  

所有Lock实现必须强制执行内置监视器锁提供的相同内存同步语义:

     
      
  • 成功的锁定操作就像成功的monitorEnter一样   行动
  •   
  • 成功的解锁操作就像一个成功的monitorExit   动作
  •   

因此,一般认为synchronized只是一种易于使用且简洁的锁定方法。您可以通过使用ReentrantLock编写代码并使用更多代码来实现完全相同的同步效果(但它提供了更多选项和灵活性)。

前一段时间ReentrantLock在某些条件下(例如高争用)更快,但现在Java使用不同的优化技术(如锁定粗化和自适应锁定)来在许多典型情况下产生性能差异程序员几乎看不到这些场景。

在低争用情况下(例如偏置锁定),优化内在锁定也做得很好。 Java平台的作者喜欢synchronized关键字和内在锁定方法,他们希望程序员不要害怕使用这个方便的工具(并防止可能的错误)。这就是为什么synchronized优化和"同步很慢"太阳和甲骨文的神话破坏是如此重要。

<强>&#34; CPU-部分&#34;问题: synchronized使用内置于JVMMONITORENTER / MONITOREXIT字节码指令中的锁定机制。所以底层实现是特定于JVM的(这就是为什么它被称为内部锁),而AFAIK 通常(可能会发生变化)使用一种相当保守的策略:一旦锁定为& #34;充气&#34;在锁获取时线程冲突后,synchronized开始使用基于操作系统的锁定(&#34;脂肪锁定&#34;)而不是快速CAS(&#34;瘦锁定&#34;)而不是&# 34;喜欢&#34;尽快再次使用CAS(即使争用已经消失)。

ReentrantLock实现基于AbstractQueuedSynchronizer并使用纯Java进行编码(使用CAS指令和线程解析,它是Java 5引入的),因此它在各个平台上更稳定,提供更大的灵活性和尝试使用快速CAS appoach每次获取一个锁(如果失败则使用OS级锁定)。

因此,这些锁实现在性能方面的主要区别在于锁获取策略(在特定的JVM实现或情况下可能不存在)。

并没有一般的答案,锁定更好+ 它是一个在时间和平台上改变的主题。您应该查看具体问题及其性质,以选择最合适的解决方案(通常在Java中)

PS:您非常好奇,我强烈建议您查看HotSpot来源以深入了解(并找出特定平台版本的确切实施)。这可能真的有帮助。起点在这里:http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/runtime/synchronizer.cpp

答案 1 :(得分:1)

实现Lock的ReentrantLock类具有与synchronized相同的并发和内存语义,但还增加了锁定轮询,定时锁等待和可中断锁等待等功能。此外,它在严重争用下提供了更好的性能。

Source

以上答案摘自Brian Goetz's article。你应该阅读整篇文章。它帮助我理解了两者的差异。