Lock的基本使用及原理筆記


java.util.concurrent 併發工具包


Lock
Lock是個接口,ReentrantLock唯一實現Lock的類
synchronized和ReentrantLock都支持重入鎖

當多個線程爭搶鎖,其他的會阻塞

AQS同步工具
1、獨佔->互斥
2、共享->讀寫鎖

AQS的基本實現
1、一個共享數據類記錄鎖的狀態(有鎖/無鎖)
state:鎖標記,0是無鎖、大於0是有鎖

通過cas實現原子性(樂觀鎖)

a、b、c線程執行lock()爭搶鎖流程(AQS)
1、a先執行lock.lock()獲取到鎖後獲取到了,執行業務代碼
2、b在執行lock.lock()沒有搶到鎖時會被包裝成Node節點加入AQS隊列並掛起,每個Node節點中會有一個pre指向上一個被掛起的Node和一個next指向下一個進來被掛起的Node
3、c接着執行lock.lock()也沒有搶到鎖,然後被包裝成Node,c的Node的pre會指向b的Node,b的Node的next會指向c的Node,這樣多個Node就組成了一個雙向鏈表
4、當a走完業務代碼執行lock.unlock()釋放了鎖後,會喚起AQS隊列中第一個Node並繼續執行業務代碼

lock.Condition
a、b線程執行lock()爭搶鎖,a在釋放鎖錢執行condition.await流程(AQS)
1、a先執行lock.lock()獲取到鎖後獲取到了,執行業務代碼
2、b在執行lock.lock()沒有搶到鎖時會被包裝成Node節點加入隊列並掛起,每個Node節點中會有一個pre指向上一個被掛起的Node和一個next指向下一個進來被掛起的Node
3、當a走業務代碼執行condition.await後被阻塞並加入到condition隊列中同時釋放鎖,然後會喚起AQS隊列中第一個Node也就是b
4、b執行lock.lock搶到鎖後執行完業務並執行condition.signal,就會把condition隊列中的第一個Node也就是A加入到AQS隊列中去等待被喚醒重新爭搶鎖

CountDownLatch/CycliBarrier
Semaphore 限流

阻塞隊列
通過ReencurrentLock和condition實現
ArrayBlockQueue
LinkBlockQueue
DelayQueue
SynchrousQueue


Atomic原子操作的原理
通過一個do-while循環不斷去查詢再CAS操作直到成功才退出循環

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章