在上面一篇分析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();
    }

網(wǎng)友評論