Java中的5種同步輔助類

2021-09-23 21:39:45 字數 1010 閱讀 8493

概述

當你使用synchronized關鍵字的時候,是通過互斥器來保障線程安全以及對共享資源的同步訪問。執行緒間也經常需要更進一步的協調執行,來完成複雜的併發任務,比如wait/notify模式就是一種在多執行緒環境下的協調執行機制。

通過api來獲取和釋放鎖(使用互斥器)或者呼叫wait/notify等方法都是底層呼叫的方式。進一步來說,有必要為執行緒同步建立更高層次的抽象。通常用到的同步輔助類,就是對2個或多個執行緒間的同步活動機制做進一步封裝,其內部原理是通過使用現有的底層api來實現複雜的執行緒間的協調。

有5種同步輔助類適用於常見的同步場景

1. semaphore 訊號量是一類經典的同步工具。訊號量通常用來限制執行緒可以同時訪問的(物理或邏輯)資源數量。

2.countdownlatch 一種非常簡單、但很常用的同步輔助類。其作用是在完成一組正在其他執行緒中執行的操作之前,允許乙個或多個執行緒一直阻塞。

3.cyclicbarrier 一種可重置的多路同步點,在某些併發程式設計場景很有用。它允許一組執行緒互相等待,直到到達某個公共的屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier在釋放等待執行緒後可以重用,所以稱它為迴圈的barrier。

4.phaser 一種可重用的同步屏障,功能上類似於cyclicbarrier和countdownlatch,但使用上更為靈活。非常適用於在多執行緒環境下同步協調分階段計算任務(fork/join框架中的子任務之間需同步時,優先使用phaser)

5.exchanger 允許兩個執行緒在某個匯合點交換物件,在某些管道設計時比較有用。exchanger提供了乙個同步點,在這個同步點,一對執行緒可以交換資料。每個執行緒通過exchange()方法的入口提供資料給他的夥伴執行緒,並接收他的夥伴執行緒提供的資料並返回。當兩個執行緒通過exchanger交換了物件,這個交換對於兩個執行緒來說都是安全的。exchanger可以認為是 synchronousqueue 的雙向形式,在運用到遺傳演算法和管道設計的應用中比較有用。

Java併發API中的幾個同步輔助類

訊號量是乙個計數器,用來保護乙個或多個共享資源的訪問。當執行緒訪問乙個乙個共享資源時,它必須得先獲取訊號量,如果訊號量大於0,則訊號量減一,該執行緒允許訪問共享資源。當訊號量等於0,則執行緒將會被置於休眠,直到訊號量大於0 public class semaphoretest 新增 param d ...

Java學習筆記 同步輔助類

countdownlatch乙個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許乙個或多個執行緒一直等待。countdownlatch中兩個比較關鍵的方法 public void await throws interruptedexception 呼叫await 方法的執行緒會被掛起,它...

Java7併發程式設計 3 執行緒同步輔助類

常用的同步有synchronized關鍵字 lock介面以及實現類,如reentrantlock reentrantreadwritelock中的readlock和writelock。在本章中將以以下幾個更高階的同步機制來實現多執行緒的同步。是一種計數器,用來保護乙個或則多個共享資源的訪問,它是併發...