【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類
文章目錄
- 【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類
- 一、volitale 常用模式
-
- 1.狀态标志
- 2.一次性安全釋出(one-time safe publication)
- 3.獨立觀察(independent observation)
- 4.volatile bean
- 5.讀寫鎖
- 二、JUC 下有哪些内容
-
- 1.atomic 包
- 2.locks 包
- 3.并發容器
- 4.任務執行架構和線程池
- 5.并發工具類
- 三、并發工具類
-
- 1.CountDownLatch
- 2.CyclicBarrier
- 3.Semaphore
- 4.總結
一、volitale 常用模式
類似于設計模式,比較抽象
1.狀态标志
使用 volatile 修飾 boolean 變量,用于訓示一個事件是否發生
2.一次性安全釋出(one-time safe publication)
在缺乏同步的情況下, 可能會遇到某個對象引用的更新值(由另一個線程寫入)和該對象狀态的舊值同時存在,典型案例就是單例模式雙檢鎖失效
3.獨立觀察(independent observation)
定期釋出觀察結果供程式内部使用。假設有一種環境傳感器能夠感覺環境溫度,一個背景線程可能會每隔幾秒讀取一次該傳感器,并更新包含目前文檔的 volatile 變量。然後,其他線程可以讀取這個變量,進而随時能夠看到最新的溫度值
4.volatile bean
基本原理:很多框為易變資料的持有者(例如 HttpSession)提供了容器,但是放入這些容器中的對象必須是線程安全的。在 volatile bean 模式中,JavaBean 的所有資料成員都是 volatile 類型
5.讀寫鎖
如果讀操作遠遠超過寫操作,可以結合内置鎖和 volatile 變量來減少性能開銷
即是用鎖進行所有變化的操作,使用 volatile 進行隻讀操作。其中,鎖一次隻允許一個線程通路值,volatile 允許多個線程執行讀操作
public class method{
private volatile int value;
public int getValue(){
return value;
}
public synchronized int increment(){
return value++;
}
}
二、JUC 下有哪些内容
1.atomic 包
提供了一系列原子變量操作類

2.locks 包
3.并發容器
4.任務執行架構和線程池
5.并發工具類
三、并發工具類
用法執行個體詳見【JUC】第四章 JUC 輔助類、讀寫鎖
1.CountDownLatch
利用它可以實作類似計數器的功能。比如有一個任務 A,它要等待其它 4 個任務執行完畢之後才能執行,此時就可以利用 CountDownLatch 來實作
//構造方法
public CountDownLatch(int count){} //參數 count 為計數值
//調用 await() 的線程會被挂起,會等待直到 count 值為 0 才繼續執行
public void await() throw InterruptedException{}
//和 await() 類似,隻不過等待一定的時間後 count 值還沒變為 0 的話就會自動繼續執行
public boolean await(long timeout, TimeUnit unit) throw InterruptedException{}
//将 count 值減 1
pulic void countDown(){}
2.CyclicBarrier
回環栅欄,通過它可以實作讓一組線程等待至某個狀态(barrier)之後再全部同時執行。叫做回環是因為當所有等待線程都被釋放之後,CyclicBarrier 可以被重用
//構造方法
public CyclicBarrier(int parties){} //參數 parties 指讓多少個線程或任務等待至 barrier 狀态
public CyclicBarrier(int parties, Runnable barrierAction){} //參數 barrierAction 為這些線程都到達 barrier狀态時會執行的内容
//用來挂起目前線程,直至所有線程都到達 barrier 狀态,再同時執行後續任務
public int await() throws InterruptedException, BrokenBarrierExceoption{}
//讓這些線程等待至一定時間,如果還有線程沒有到達 barrier 狀态就直接讓到達 barrier 的線程執行後續任務
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException{}
3.Semaphore
直譯為信号量,Semaphore 可以同時讓多個線程同時通路共享資源,通過 acquire() 擷取一個許可,如果沒有就等待,通過 release() 釋放許可
//構造方法
public Semaphore(int permits){ //參數 permits 表示許可數目,即同時可以允許多少線程進行通路
sync = new NonfairSycn(permits);
}
public Semaphore(int permits, boolean fair){ //fair 表示是否公平
sync = (fair) ? new FairSync(permits) : new NonfairSync(permits);
}
//擷取一個許可
public void acquire() throws InterruptedException{}
//擷取 permits 個許可
public void acquire(int permits) throws InterruptedException{}
//釋放一個許可
public void release(){}
//釋放 permits 個許可
public void release(int permits){}
4.總結
CountDownLatch 和 CyclicBarrier 都能實作線程之間的等待,隻不過它們側重點不同:
- CountDownLatch 一般用于某個線程 A 等待若幹個其他線程執行完任務之後,他才執行
- CyclicBarrier 一般用于一組線程互相等待至某個狀态,然後這一組線程再同時執行
- CountDownLatch 不可重用,CyclicBarrier 可重用
Semaphore 和鎖類似,一般用于控制對某組資源的通路權限,而鎖時是控制對某個資源的通路權限