ReeteantLock簡單實用

先初始化一個ReentrantLock物件,lock方法是加鎖,unlock釋放鎖,
ReetrantLock加鎖原理
ReetrantLock有公平鎖和非公平鎖

建構式傳入true是公平鎖,false是非公平鎖,
公平鎖


先判斷是否有執行緒持有鎖,state為0表示沒人持有鎖狀態,如果沒人持有鎖,在判斷佇列是否初始化是否排隊的執行緒,如果沒有則嘗試cas加鎖,加鎖成功設定當前執行緒并回傳成功

如果有人持有鎖,判斷是否是當前執行緒,如果是當前執行緒回傳成功

嘗試加鎖失敗,判斷佇列是否初始化,如果沒有就初始化,初始化好在進行一次cas加鎖,如果失敗就加入佇列呼叫park方法等待
如果佇列初始化好,并且有執行緒排隊,直接加入佇列呼叫park方法等待

非公平鎖


直接嘗試cas加鎖,加鎖成功設定當前執行緒并回傳成功

判斷是否是當前執行緒,如果是當前執行緒回傳成功

如果還是失敗,判斷是否有執行緒持有鎖,如果有加入佇列呼叫park方法等待
如果沒有再次嘗試cas加鎖,失敗加入佇列呼叫park方法等待老老實實排隊

釋放鎖

設定獲取鎖執行緒為空,釋放鎖并呼叫unpark方法喚醒下一個執行緒
總結:公平鎖,保證順序獲取鎖
非公平鎖,有兩次插隊的機會,只要進入佇列就只能排隊
非公平鎖性能稍好一點
park方法會呼叫作業系統底層,需要背景關系切換,消耗較大
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/234878.html
標籤:java
上一篇:idea檔案右鍵創建New沒有Create New Servlet的解決辦法
下一篇:史上最全Java8日期時間工具類
