Concurrent包第二部分

一、CyclicBarrier柵欄

1、柵欄概述
  Concurrent包中提供的一種併發構造,可以實現多個併發的線程在執行過程中,在某一個節點進行阻塞等待,直到所有的線程都到達了指定位置後,一起放開阻塞繼續運行的效果。例子:賽馬。

2、API

CyclicBarrier(int parties):
構造方法,接收一個初始值,指定了柵欄要等待的線程的數量。通過創建一個新的 CyclicBarrier,它將在給定數量的參與者(線程)處於等待狀態時啓動。
當線程到達了柵欄時,可以調用此方法,進入阻塞等待的狀態,線程被掛起,直到在柵欄上等待的線程的數量達到了柵欄上設定的要等待的線程的數量,所有線程的阻塞同時被放開,一起繼續執行。

await() :

在所有參與者都已經在此 barrier 上調用 await 方法之前,將一直等待。

二、Exchanger交換機

1、交換機概述
可以實現兩個線程交換對象的效果,先到達的線程會產生阻塞等待後續到來的線程,直到兩個線程都到達交換機後,互換對象,各自繼續執行。

2、API

exchanger() 

構造方法。
在交換機中交換對象的方法,先到的線程調用此方法時,會進入阻塞狀態,直到另一個線程也調用這個方法,互換對象,阻塞放開,各自繼續執行。

exchange(V x) 

等待另一個線程到達此交換點(除非當前線程被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。

三、Semaphore信號量

1、信號量概述
Concurrent包中提供的一個併發構造,可以在創建信號量時指定信號量的初始數量,後續可以調用acquire()來獲取信號量,通過release()釋放信號量,如果某一個時刻,信號量被取完,再調用acquire()方法時,該方法將會產生阻塞,直到有其他線程release()信號量回來。

2、信號量的主要用途
(1)保護一個重要代碼,防止一次超過 N 個線程進入。
(2)在兩個線程之間發送信號。

3、API
構造方法,在構造的時候需要指定信號量的初始值,可選的還可以傳入一個布爾類型的值,來指定當前信號量是否採用公平策略,默認是不公平的。
補充:
不公平策略就是不管哪個線程是先來的,哪個線程是後到的,一有資源,讓他們搶佔。相反,公平策略就是把資源分配給先到先等帶的線程。
Semaphore(int permits) 創建具有給定的許可數和非公平的公平設置的信號量。
Semaphore(int permits, boolean fair) 創建具有給定的許可數和給定的公平設置的 信號量。

acquire() 從此信號量獲取一個許可,在提供一個許可前一直將線程阻塞,否則線程被中斷。獲得信號量,在信號量上數量-1,如果已經沒有剩餘的信號量,則此方法將會阻塞,直到有其他線程釋放信號量。

release() 釋放一個許可,將其返回給信號量。 釋放信號量,在信號量上數量+1。
4、案例

四、Atmoic原子性

在java中最基本的運算都是非原子性的,在底層存在多個步驟,所以在多線程併發操作的過程中有可能有多線程併發安全問題。

解決方案有兩種:
解決方案1:
使用同步代碼塊進行同步,可以解決問題,但是如果在多線程併發場景下,最基本的運算都要同步的話,代碼會被大量的同步代碼塊包裹,代碼混亂,效率低下。

解決方案2:
使用Concurrent包中提供的Atomic原子型操作。

1、Atomic原子型操作
爲了解決以上問題,在Concurrent包中,提供了大量可以實現原子型操作的包裝類型

java.util.concurrent.atomic 
類 AtomicBoolean

java.util.concurrent.atomic 
類 AtomicInteger

java.util.concurrent.atomic 
類 AtomicLong

java.util.concurrent.atomic 
類 AtomicReference<V>

AtomicInteger爲例:

構造方法摘要
AtomicInteger()創建具有初始值 0 的新 AtomicInteger。
AtomicInteger(int initialValue) 創建具有給定初始值的新 AtomicInteger。
int getAndAdd(int delta) 以原子方式將給定值與當前值相加。返回原有值後在原值上加給定值,類似於i++的原理
int getAndIncrement() 以原子方式將當前值加 1,獲取原值後在原值上加一
int getAndDecrement() 以原子方式將當前值減 1,獲取原值後在原值上減一
void set(int newValue) 設置爲給定值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章