JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock

JDK中实现锁的主要方式有两种:

    1. Synchronized :Synchronized是非公平的

    2. ReentrantLock:有公平和非公平两种实现方式

锁的公平与不公平:公平锁是指线程获得锁的顺序按照fifo的原则,先排队的先得。非公平锁指每个线程都先要竞争锁,不管排队先后,所以后到的线程有可能无需进入等待队列直接竞争到锁。非公平锁虽然可能导致某些线程饥饿,但是锁的吞吐率是公平锁好几倍,synchronized是一个典型的非公平锁方案,而且没法做成公平锁。

本篇文章重点分析ReentrantLock的公平非公平两种实现方式,本文源码基于JDK1.8.0_151

ReentrantLock中的公平非公平锁主要实现在下图中的FairSync和NonfairSync中,默认构造函数是非公平的实现方式

JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock_第1张图片
JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock_第2张图片

非公平在ReentrantLock中主要在NonfairSync中实现,

JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock_第3张图片


JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock_第4张图片

公平锁在ReentrantLock中主要在FairSync中实现,见tryAcquire()方法

JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock_第5张图片

参考文章:synchronized、锁、多线程同步的原理是咋样的 https://www.jianshu.com/p/5dbb07c8d5d5

你可能感兴趣的:(JDK 公平锁非公平锁源码解析Synchronized和ReentrantLock)