JDK中实现锁的主要方式有两种:
1. Synchronized :Synchronized是非公平的
2. ReentrantLock:有公平和非公平两种实现方式
锁的公平与不公平:公平锁是指线程获得锁的顺序按照fifo的原则,先排队的先得。非公平锁指每个线程都先要竞争锁,不管排队先后,所以后到的线程有可能无需进入等待队列直接竞争到锁。非公平锁虽然可能导致某些线程饥饿,但是锁的吞吐率是公平锁好几倍,synchronized是一个典型的非公平锁方案,而且没法做成公平锁。
本篇文章重点分析ReentrantLock的公平非公平两种实现方式,本文源码基于JDK1.8.0_151
ReentrantLock中的公平非公平锁主要实现在下图中的FairSync和NonfairSync中,默认构造函数是非公平的实现方式
非公平在ReentrantLock中主要在NonfairSync中实现,
公平锁在ReentrantLock中主要在FairSync中实现,见tryAcquire()方法
参考文章:synchronized、锁、多线程同步的原理是咋样的 https://www.jianshu.com/p/5dbb07c8d5d5
网友评论