在上面一篇分析ThreadExecutedPool的文章中我們看到線程池實現(xiàn)源碼中大量使用了ReentrantLock鎖,那么ReentrantLock鎖的優(yōu)勢是什么?它又是怎么實現(xiàn)的呢?
ReentrantLock又名可重入鎖,為什么稱之為可重入鎖呢?簡單來說因為它允許一個線程多次取獲得該鎖,不過多次獲取該鎖之后,也需要執(zhí)行同樣次數(shù)的釋放鎖操作,否則該鎖將被當前線程一直持有,導致其它線程無法獲取。需要注意的是,釋放鎖的操作需要我們用代碼來控制,它并不會自動取釋放鎖。在ReentrantLock中實現(xiàn)了兩種鎖fairSync和NonfairSync,即公平鎖和非公平鎖,今天我們就來聊聊ReentrantLock中nonfairSync鎖的實現(xiàn)。
廢話不多說,下面開始分析代碼!

1、1 Lock()

首先看一下lock()方法,這個方法非常重要,它也是我們獲取鎖的入口:

    final void lock() {        if (compareAndSetState(0, 1))            setExclusiveOwnerThread(Thread.currentThread());        else
            acquire(1);
    }

ReentrantLock鎖的初始狀態(tài)為0,compareAndSetState方法將嘗試獲取鎖并將當前鎖的狀態(tài)設(shè)置為1。如果成功獲取了鎖會調(diào)用setExclusiveOwnerThread()方法設(shè)置當前線程擁有該鎖的獨占訪問權(quán)。
如果調(diào)用compareAndSetState()獲取鎖失敗,則返回false并執(zhí)行acquire(1)。

    public final void acquire(int arg) {        if (!tryAcquire(arg) &&            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))            selfInterrupt();
    }

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設(shè)計培訓,網(wǎng)站建設(shè)培訓學習是年輕人改變自己的最好方式