天天看點

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

【重難點】【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 包

提供了一系列原子變量操作類

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

2.locks 包

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

3.并發容器

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

4.任務執行架構和線程池

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

5.并發工具類

【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類【重難點】【JUC 02】volitale 使用常用模式 、JUC 下有哪些内容 、并發工具類一、volitale 常用模式二、JUC 下有哪些内容三、并發工具類

三、并發工具類

用法執行個體詳見【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 和鎖類似,一般用于控制對某組資源的通路權限,而鎖時是控制對某個資源的通路權限

繼續閱讀