R eentrantLock的源码分析
生活随笔
收集整理的這篇文章主要介紹了
R eentrantLock的源码分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
以ReentrantLock作為切入點,來看看在這個場景中是如何使用AQS來實現(xiàn)線程的同步的
ReentrantLock的時序圖
調用ReentrantLock中的lock()方法,源碼的調用過程我使用了時序圖來展現(xiàn)。
?ReentrantLock.lock()?
這個是reentrantLock獲取鎖的入口?
public void lock() { sync.lock(); }sync實際上是一個抽象的靜態(tài)內部類,它繼承了AQS來實現(xiàn)重入鎖的邏輯,我們前面說過AQS是一個同步隊列,它能夠實現(xiàn)線程的阻塞以及喚醒,但它并不具備業(yè)務功能,所以在不同的同步場景中,會繼承AQS來實現(xiàn)對應場景的功能
Sync有兩個具體的實現(xiàn)類,分別是:
NofairSync:表示可以存在搶占鎖的功能,也就是說不管當前隊列上是否存在其他線程等待,新線程都有機會搶占鎖
FailSync:?表示所有線程嚴格按照FIFO來獲取鎖
NofairSync.lock?
以非公平鎖為例,來看看lock中的實現(xiàn)
1. 非公平鎖和公平鎖最大的區(qū)別在于,在非公平鎖中我搶占鎖的邏輯是,不管有沒有線程排隊,我先上來cas去搶占一下
2. CAS成功,就表示成功獲得了鎖
3. CAS失敗,調用acquire(1)走鎖競爭邏輯
final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); }?
總結
以上是生活随笔為你收集整理的R eentrantLock的源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 释放锁以及添加线程对于队列的变化
- 下一篇: CAS的实现原理