ReentrantLock原始碼解析

2021-07-25 02:21:20 字數 1637 閱讀 2597

先看具體的使用吧:

public

class

reentrantlocktest finally

}public

void

reader() finally

}@test

public

void

run() catch (exception e)

writer();

reader();

}});

thread.run();

}reader();}}

從上面的**可以看出,可通過reentrantlock的lock()方法來獲取鎖,unlock()方法來釋放鎖。

reentrantlock的實現依賴於abstractqueuedsynchronizer(簡稱aqs),接下來就原始碼來做一些簡要的分析。

//不帶參構造方法,只能宣告非公平鎖,在使用的時候需要注意

public

reentrantlock()

//帶參構造方法,fair == ture:公平鎖,fair == false:非公平鎖

public

reentrantlock(boolean fair)

到tryacquire方法呼叫時才真正加鎖,我們著重看一下該方法的原始碼:

protected

final

boolean

tryacquire(int acquires)

}//假若當前還未有執行緒獲取到鎖,並且沒有其他的執行緒等待鎖的時間比當前執行緒等待時間更長,分配鎖給該執行緒(不支援搶占)

else

if (current == getexclusiveownerthread()) //當前執行緒再次進入鎖(可重入,state表示該執行緒進入的次數)

return

false;

}

tryrelease方法被呼叫時,釋放鎖,它的原始碼如下:

protected

final

boolean

tryrelease(int releases)

setstate(c);

return free;// state == 0的時候表示當前沒有執行緒獲取到鎖,並且,鎖釋放成功一定是當前執行緒的state == 0

}

接下來我們來看看非公平鎖,非公平鎖的釋放與公平鎖完全一樣,在這裡就不再做贅述了,我們著重看一下非公平鎖的加鎖呼叫。

呼叫軌跡如下:

我們來看看加鎖部分的原始碼:

final

void lock()

protected

final

boolean

compareandsetstate(int expect, int update)

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...