ReentrantLock 是轻量级锁吗?
Is ReentrantLock is a light weight lock?
众所周知,HotSpot VM有偏向锁、自旋锁、轻量级锁、重量级锁等,而ReentrantLock是通过AbstractQueuedSynchronizer(AQS)实现的。那么ReentrantLock是JVM中的轻量级锁吗?
这些是不同的概念。
自旋锁、偏向锁等是algorithms/structures实现锁机制(互斥量)的名称。
在 HotSpot 术语中,偏向锁、轻量级(瘦)锁和重量级(膨胀)锁是 Java 内部监视器的可能状态,即您可以同步的 Java 对象使用 synchronized
关键字。
在不同的时刻,同一个Java监视器可以处于不同的状态,例如
- 在第一次尝试锁定时,对象偏向某个线程。
- 稍后,当另一个线程获取锁时,偏置被撤销,并且使用简单的 CAS 成功地重新获取监视器 - 这将是一个 thin 锁。
- 最后,当另一个线程试图释放已经锁定的监视器时,锁定 膨胀。
ReentrantLock
是一个 Java class,它独立于 Java 内在监视器实现互斥锁的语义。也就是说,术语 biased、thin 和 inflated 不适用于 ReentrantLock
。
同时,ReentrantLock
实现也有多个不同的路径。简单的情况下,在没有竞争的情况下,获取ReentrantLock
就是一个CAS的事情。在竞争情况下,ReentrantLock
涉及等待队列,并调用park
将当前线程从RUNNABLE
状态切换到WAITING
状态。从这个意义上说,该机制类似于 JVM 的瘦锁和膨胀锁。但是再说一次:由于ReentrantLock
不是一个内在的监视器,所以将它与JVM的轻量级和重量级锁进行比较是不太正确的。
众所周知,HotSpot VM有偏向锁、自旋锁、轻量级锁、重量级锁等,而ReentrantLock是通过AbstractQueuedSynchronizer(AQS)实现的。那么ReentrantLock是JVM中的轻量级锁吗?
这些是不同的概念。
自旋锁、偏向锁等是algorithms/structures实现锁机制(互斥量)的名称。
在 HotSpot 术语中,偏向锁、轻量级(瘦)锁和重量级(膨胀)锁是 Java 内部监视器的可能状态,即您可以同步的 Java 对象使用 synchronized
关键字。
在不同的时刻,同一个Java监视器可以处于不同的状态,例如
- 在第一次尝试锁定时,对象偏向某个线程。
- 稍后,当另一个线程获取锁时,偏置被撤销,并且使用简单的 CAS 成功地重新获取监视器 - 这将是一个 thin 锁。
- 最后,当另一个线程试图释放已经锁定的监视器时,锁定 膨胀。
ReentrantLock
是一个 Java class,它独立于 Java 内在监视器实现互斥锁的语义。也就是说,术语 biased、thin 和 inflated 不适用于 ReentrantLock
。
同时,ReentrantLock
实现也有多个不同的路径。简单的情况下,在没有竞争的情况下,获取ReentrantLock
就是一个CAS的事情。在竞争情况下,ReentrantLock
涉及等待队列,并调用park
将当前线程从RUNNABLE
状态切换到WAITING
状态。从这个意义上说,该机制类似于 JVM 的瘦锁和膨胀锁。但是再说一次:由于ReentrantLock
不是一个内在的监视器,所以将它与JVM的轻量级和重量级锁进行比较是不太正确的。