在上面一篇分析ThreadExecutedPool的文章中我們看到線程池實(shí)現(xiàn)源碼中大量使用了ReentrantLock鎖,那么ReentrantLock鎖的優(yōu)勢是什么?它又是怎么實(shí)現(xiàn)的呢?
ReentrantLock又名可重入鎖,為什么稱之為可重入鎖呢?簡單來說因為它允許一個線程多次取獲得該鎖,不過多次獲取該鎖之后,也需要執(zhí)行同樣次數(shù)的釋放鎖操作,否則該鎖將被當(dāng)前線程一直持有,導(dǎo)致其它線程無法獲取。需要注意的是,釋放鎖的操作需要我們用代碼來控制,它并不會自動取釋放鎖。在ReentrantLock中實(shí)現(xiàn)了兩種鎖fairSync和NonfairSync,即公平鎖和非公平鎖,今天我們就來聊聊ReentrantLock中nonfairSync鎖的實(shí)現(xiàn)。
廢話不多說,下面開始分析代碼!
1、1 Lock()
首先看一下lock()方法,這個方法非常重要,它也是我們獲取鎖的入口:
final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); }
ReentrantLock鎖的初始狀態(tài)為0,compareAndSetState方法將嘗試獲取鎖并將當(dāng)前鎖的狀態(tài)設(shè)置為1。如果成功獲取了鎖會調(diào)用setExclusiveOwnerThread()方法設(shè)置當(dāng)前線程擁有該鎖的獨(dú)占訪問權(quán)。
如果調(diào)用compareAndSetState()獲取鎖失敗,則返回false并執(zhí)行acquire(1)。
public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }