實現鎖的關鍵在於:
通過cas操作與volatile變數互相配合,執行緒安全的修改鎖標誌位
基於clh佇列,實現鎖的排隊策略,對於公平鎖,當前執行緒只需要監控他的前驅節點的鎖情況,當前鎖持有這肯定是頭節點
個人理解記錄
reentrantlock基於aqs實現,他的基本原理是aqs的status為0時表示鎖被占用,為1時表示鎖被釋放。reentrantlock在使用時需要顯式的獲取和釋放鎖,一般用try finally來實現,相對於synchronized,reentrantlock提供了功能更強大的api,例如超時鎖、可中斷鎖、公平鎖、非公平鎖、非阻塞鎖獲取等等,reentrantlock是獨佔鎖,它分為公平鎖和非公平鎖兩種模式,公平鎖保證按照獲取鎖的順序來得到鎖,非公平鎖則則可以進行搶占,而像countdownlatch、semaphore等元件是基於共享鎖實現的,也就是同一時刻可以有多個執行緒獲取鎖,鎖的數量由使用者指定。
獨佔公平鎖原理:
呼叫aqs的lock方法嘗試獲取鎖
呼叫上層元件reentrantlock的trylock方法嘗試獲取同步狀態
如果獲取成功,則成功獲取鎖,如果獲取失敗,則被構造成node節點後,利用cas執行緒安全的加到同步對列的末尾
然後該執行緒進入自旋狀態
自旋時首先判斷前驅節點是否為頭節點並且能否成功獲取到同步狀態,如果都成立,則成功獲取鎖,如果不成立,則先講將其前驅節點等待狀態設定為signal,然後利用locksupport掛起,等待前驅執行緒喚醒當被前驅節點喚醒,且成功回去同步狀態後,才成功獲取到了鎖。
對於釋放鎖,就是通過aqs設定同步狀態為1的過程,同時喚醒後繼節點
獨佔非公平鎖:
獨佔非公平鎖與公平鎖的唯一區別是,在獲取鎖時,不管是否有執行緒在等待鎖,直接通過aqs修改同步狀態,進行鎖搶占,如果搶占失敗,那後面的流程就與公平鎖一致了。
共享鎖原理:
共享鎖的基本流程與獨佔鎖相同,主要區別在於判斷鎖獲取的條件上,由於是共享鎖,也就允許多個執行緒同時獲取,所以同步狀態的數量同時的大於1的,如果同步狀態為非0,則執行緒就可以獲取鎖,只有當同步狀態為0時,才說明共享數量的鎖已經被全部獲取,其餘執行緒只能等待。
共享鎖的釋放過程正好與之相反,釋放鎖對應的aqs操作時增加同步狀態的值。
aqs同步佇列的資料結構:詳情請參考:
同步佇列是乙個雙向佇列,aqs通過持有頭尾指標管理同步佇列;
節點的資料結構,即aqs的靜態內部類node,節點的等待狀態等資訊;
lock介面和核心方法
lock介面和synchronized的比較
synchronized**簡潔,lock:獲取鎖可以被中斷,超時獲取鎖,嘗試獲取鎖,讀多寫少用讀寫鎖
可重入鎖reentrantlock、所謂鎖的公平和非公平
如果在時間上,先對鎖進行獲取的請求,一定先被滿足,這個鎖就是公平的,不滿足,就是非公平的
非公平的效率一般來講更高
readwritelock介面和讀寫鎖reentrantreadwritelock
reentrantlock和syn關鍵字,都是排他鎖,
讀寫鎖:同一時刻允許多個讀執行緒同時訪問,但是寫執行緒訪問的時候,所有的讀和寫都被阻塞,最適宜與讀多寫少的情況
condition介面
用lock和condition實現等待通知
了解locksupport工具
park開頭的方法
unpark(thread thread)方法
abstractqueuedsynchronizer深入分析
什麼是aqs?學習它的必要性
aqs使用方式和其中的設計模式
了解其中的方法
aqs中的資料結構-節點和同步佇列
節點在同步佇列中的增加和移出
獨佔式同步狀態獲取與釋放
其他同步狀態獲取與釋放
condition分析
顯式鎖和AQS
lock介面和核心方法 lock介面和synchronized的比較 synchronized 簡潔,lock 獲取鎖可以被中斷,超時獲取鎖,嘗試獲取鎖,讀多寫少用讀寫鎖 可重入鎖reentrantlock 所謂鎖的公平和非公平 如果在時間上,先對鎖進行獲取的請求,一定先被滿足,這個鎖就是公平的,不...
隱式鎖與顯式鎖詳細對比
synchronized修飾的物件,該物件就是隱式鎖,例子如下 public static void main string args static class ticket implements runnable catch interruptedexception e count system....
顯式鎖與隱式鎖的區別
解決的方法 格式描述 同步 塊 關鍵字 synchronized 鎖物件 隱式鎖,多個執行緒的鎖物件必須唯一 同步方法 修飾符 synchronized 返回型別 方法名 隱式鎖,誰呼叫該方法誰就是鎖物件 顯示鎖reentrantlock類的lock unlock 方法 顯式鎖,有程式設計師決定在那...