ReentrantLock和Synchronized的異同點:
總結
實現鎖的關鍵在於:
- 通過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同步隊列的數據結構:詳情請參考:https://www.jianshu.com/p/cc308d82cc71
- 同步隊列是一個雙向隊列,AQS通過持有頭尾指針管理同步隊列;
- 節點的數據結構,即AQS的靜態內部類Node,節點的等待狀態等信息;
1、顯式鎖和AQS
顯式鎖
Lock接口和核心方法
Lock接口和synchronized的比較
synchronized 代碼簡潔,Lock:獲取鎖可以被中斷,超時獲取鎖,嘗試獲取鎖,讀多寫少用讀寫鎖
可重入鎖ReentrantLock、所謂鎖的公平和非公平
如果在時間上,先對鎖進行獲取的請求,一定先被滿足,這個鎖就是公平的,不滿足,就是非公平的
非公平的效率一般來講更高
ReadWriteLock接口和讀寫鎖ReentrantReadWriteLock
ReentrantLock和Syn關鍵字,都是排他鎖,
讀寫鎖:同一時刻允許多個讀線程同時訪問,但是寫線程訪問的時候,所有的讀和寫都被阻塞,最適宜與讀多寫少的情況
Condition接口
用Lock和Condition實現等待通知
瞭解LockSupport工具
park開頭的方法
unpark(Thread thread)方法
AbstractQueuedSynchronizer深入分析
什麼是AQS?學習它的必要性
AQS使用方式和其中的設計模式
瞭解其中的方法
AQS中的數據結構-節點和同步隊列
節點在同步隊列中的增加和移出
獨佔式同步狀態獲取與釋放
其他同步狀態獲取與釋放
Condition分析