第242天學習打卡(知識點回顧 AQS)
AQS ----CyclicBarrier
CyclicBarrier :類似於CountDownLatch,它能阻塞執行緒知道某個事件發生。CyclicBarrier 與CountDownLatch的關鍵區別在於:所有的執行緒必須同時到達柵欄位置,才能繼續執行。CountDownLatch用於等待事件,而柵欄用於等待其他執行緒。
await: await方法的執行緒告訴CyclicBarrier自己已經到達同步點,然後當前執行緒被阻塞。CyclicBarrier同樣提供帶超時時間的await和不帶超時時間的await方法。
CountDownLatch基於AQS的共享模式使用,而CyclicBarrier基於Condition來實現的。
AQS---- CountDownLatch
通過一個計數器來實現,計數器的初始值是執行緒的數量。每當一個執行緒執行完畢後,計數器的值就-1,當計數器的值為0的時候,表示所有的執行緒執行完畢。
await():呼叫await()方法的執行緒會被掛起,它會等待直到count值為0才繼續執行。
await(long timeout, TimeUnit unit):等待一定時間後count值還沒有變為0的話就會繼續執行。
countDown():將count值減1
AQS----ReentrantLock
與Synchronized的對比:
-
synchronized獲取鎖無法設定超時,reentrantLock可以設定獲取鎖的超時時間。
-
synchronized無法實現公平鎖,reentrantLock可以實現公平鎖。
-
synchronized是java中的關鍵字,無法提供外部方法,使用的都是Object類的方法;reetrantLock是juc中鎖的一種實現,提供的方法多一些。
-
synchronized在加鎖程式碼塊執行完成或者出現異常,自動釋放鎖;ReentantLock不會自動釋放鎖,需要在finally()程式碼塊中顯示釋放。
鎖實現:
-
公平鎖FairSync 每個執行緒公平的獲取鎖,不會出現執行緒飢餓的情況
-
Condition:
-
多執行緒協調通訊類
-
Condition 維護了一個執行緒等待佇列,也是多執行緒間協調通訊的工具類,使得執行緒一起等待某個條件,滿足條件才喚醒,喚醒後,還需要重新競爭鎖。
AQS----ReentrantReadWriteLock
java的併發包提供了讀寫鎖ReentrantReadWriteLock,它表示兩個鎖,一個是讀操作相關的鎖,稱為共享鎖,一個是寫相關的鎖,稱為排它鎖。
讀寫鎖有三個重要的特性:
公平選擇性:支援非公平(預設)和公平的鎖獲取方式,吞吐量還是非公平優於公平。
重入:讀鎖和寫鎖都支援執行緒重入。
讀降級:遵循獲取寫鎖,獲取讀鎖再釋放寫鎖的次序,寫鎖能降級稱為讀鎖。
B站: