1. 程式人生 > 其它 >第242天學習打卡(知識點回顧 AQS)

第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 每個執行緒公平的獲取鎖,不會出現執行緒飢餓的情況

  • 非公平鎖NonFairSync 搶佔式獲取鎖,容易出現執行緒飢餓情況。

Condition:

  • 多執行緒協調通訊類

  • Condition 維護了一個執行緒等待佇列,也是多執行緒間協調通訊的工具類,使得執行緒一起等待某個條件,滿足條件才喚醒,喚醒後,還需要重新競爭鎖。

AQS----ReentrantReadWriteLock

java的併發包提供了讀寫鎖ReentrantReadWriteLock,它表示兩個鎖,一個是讀操作相關的鎖,稱為共享鎖,一個是寫相關的鎖,稱為排它鎖。

讀寫鎖有三個重要的特性:

公平選擇性:支援非公平(預設)和公平的鎖獲取方式,吞吐量還是非公平優於公平。

重入:讀鎖和寫鎖都支援執行緒重入。

讀降級:遵循獲取寫鎖,獲取讀鎖再釋放寫鎖的次序,寫鎖能降級稱為讀鎖。

B站:尚矽谷2021逆襲版Java面試題第三季(java大廠面試題,周陽主講)嗶哩嗶哩bilibili