ReentrantLock 是轻量级锁吗?

Rya*_*nqy 1 jvm reentrantlock

众所周知,HotSpot VM 有偏向锁、自旋锁、轻量级锁、重量级锁等等,而 ReentrantLock 是通过 AbstractQueuedSynchronizer 实现的?AQS??那么 ReentrantLock 是 JVM 中的轻量级锁吗?

apa*_*gin 9

这些是不同的概念。

自旋锁、偏置锁等是用于实现锁定机制(互斥锁)的算法/结构的名称。

在 HotSpot 术语中,偏向锁、轻量级(瘦)锁和重量级(膨胀)锁是 Java 内部监视器的可能状态,即您可以使用synchronized关键字同步的 Java 对象。

在不同的时刻,同一个 Java 监视器可以处于不同的状态,例如

  1. 在第一次锁定尝试时,对象偏向于某个线程。
  2. 稍后,当另一个线程获取锁时,偏差被撤销,并且使用简单的 CAS 成功重新获取监视器 - 这将是一个锁。
  3. 最后,当不同的线程试图释放已经锁定的监视器时,锁被膨胀

ReentrantLock是一个 Java 类,它独立于 Java 内部监视器实现互斥锁的语义。也就是说,biasedthininflated 等术语不适用于ReentrantLock

同时,ReentrantLock实现也有多种不同的路径。在一个简单的情况下,当没有争用时,获取ReentrantLock是单个 CAS 的问题。在竞争的情况下,ReentrantLock涉及等待队列,并调用park将当前线程从状态切换RUNNABLEWAITING状态。从这个意义上说,该机制类似于 JVM 的瘦和膨胀锁。但同样:由于ReentrantLock不是内在监视器,因此将其与 JVM 的轻量级和重量级锁进行比较并不完全正确。