併發程式設計 併發工具的使用及原理

2022-01-17 08:10:24 字數 884 閱讀 1660

condition

condition.await() ---> aqs.await():1、先addconditionwaiter(),把當前節點加入到condition佇列中(等待佇列),waitstatus=-2,這個入隊的流程和aqs有些類似,但是這裡沒有空的頭結點,入隊的執行緒節點自身就是頭結點,而且是單向鍊錶。2、fullyrelease,看方法名就是全部釋放鎖,意思就是重入次數全部釋放。然後去喚醒aqs中head.next節點(喚醒 != 拿到鎖,可能會被插隊)。

condition.await() ---> aqs.signal():1、將等待佇列node的waitstatus改成0,再加到aqs阻塞佇列中,再把原節點移除,node加入到aqs以後,需要進行acquirequeued()操作,該操作會嘗試去獲取鎖,獲取不到鎖後會將前置節點的狀態置為signal,然後掛起。

countdownlatch

計數器,發令槍。核心方法是await()和countdown()。

基於共享鎖實現,底層還是addwaiter(),建立status為shared進入aqs佇列。然後節點都會在aqs阻塞,當countdown()使得state(鎖次數)變為0時,會從頭節點開始挨個喚醒aqs佇列中的執行緒。

semaphore

限流工具,也分公平和非公平。構造引數permits代表令牌,執行緒會去獲取令牌,假如獲取失敗就會進入阻塞狀態。state表示令牌數,也是基於共享鎖的實現。假如令牌數不夠了,進入aqs佇列等待,喚醒時會還回乙個令牌。公平和非公平的區別類似於普通的鎖,非公平鎖會出現插隊情況,公平鎖不會。

cyclicbarrier

柵欄,使一組執行緒到達共享點之前阻塞。當await()次數到達 構造引數 parties時,開始後面的邏輯。當parties到達目標值後會開啟新的迴圈,重新等await()減到0。

併發工具的使用

之前的文章中學習了j.u.c中aqs的底層實現原理,這篇文學習一下j.u.c中提供的一些執行緒同步工具類。在前面學習 synchronized 的時候,有講到 wait notify 的基本使用,結合 synchronized 可以實現對執行緒的通訊。既然 j.u.c 裡面提供了鎖的實現機制,那 j...

併發程式設計學習 併發程式設計的挑戰

死鎖 資源限制的挑戰 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行緒執行任務讓程式執行的更快,會面臨非常多的挑戰,比如上下文切換的問題,死鎖的問題,以及受限於硬體和軟體的資源限制問題 即使是單核處理器也支...

併發程式設計 執行緒的使用

新建狀態 執行new以後,還沒開始執行 就緒狀態 執行了start方法以後,等待cup分配時間執行run方法 執行狀態 執行run方法以後 阻塞狀態 sleep 鎖 阻塞佇列等 死亡狀態 執行完成或報出異常 public class extendscreate extends thread publ...