04 JDK併發包相關類

1 Condition

Condition是在java 1.5中才出現的,它用來替代傳統的Object的wait()、notify()實現線程間的協做,相比使用Object的wait()、notify(),使用Condition的await()、signal()這種方式實現線程間協做更加安全和高效。Condition須要結合ReentrantLock使用。java

Condition的優點是支持多路等待,便可以定義多個Condition,每一個condition控制線程的一條執行通路,是對傳統方式的優化。傳統方式只能是一路等待。緩存

方法名稱安全

描述多線程

await()併發

當前線程進入等待狀態直到被通知(signal)或者中斷;優化

當前線程進入運行狀態並從await()方法返回的場景包括:spa

(1)其餘線程調用相同Condition對象的signal/signalAll方法,而且當前線程被喚醒;操作系統

(2)其餘線程調用interrupt方法中斷當前線程;線程

awaitUninterruptibly()對象

當前線程進入等待狀態直到被通知,在此過程當中對中斷信號不敏感,不支持中斷當前線程

awaitNanos(long)

當前線程進入等待狀態,直到被通知、中斷或者超時。若是返回值小於等於0,能夠認定就是超時了

awaitUntil(Date)

當前線程進入等待狀態,直到被通知、中斷或者超時。若是沒到指定時間被通知,則返回true,不然返回false

signal()

喚醒一個等待在Condition上的線程,被喚醒的線程在方法返回前必須得到與Condition對象關聯的鎖

signalAll()

喚醒全部等待在Condition上的線程,可以從await()等方法返回的線程必須先得到與Condition對象關聯的鎖

 

 

2 Lock

lock鎖的相關概念:

可重入鎖:可重入鎖是指同一個線程能夠屢次獲取同一把鎖。ReentrantLock和synchronized都是可重入鎖。

可中斷鎖:可中斷鎖是指線程嘗試獲取鎖的過程當中,是否能夠響應中斷。synchronized是不可中斷鎖,而ReentrantLock則提供了中斷功能。

公平鎖與非公平鎖。公平鎖是指多個線程同時嘗試獲取同一把鎖時,獲取鎖的順序按照線程達到的順序,而非公平鎖則容許線程「插隊」,ReentrantLock的默認實現是非公平鎖,可是也能夠設置爲公平鎖。

CAS操做(CompareAndSwap):CAS操做簡單的說就是比較並交換。CAS 操做包含三個操做數 —— 內存位置(V)、預期原值(A)和新值(B)。若是內存位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新爲新值。不然,處理器不作任何操做。不管哪一種狀況,它都會在 CAS 指令以前返回該位置的值。CAS 有效地說明了「我認爲位置 V 應該包含值 A;若是包含該值,則將 B 放到這個位置;不然,不要更改該位置,只告訴我這個位置如今的值便可。」 Java併發包(java.util.concurrent)中大量使用了CAS操做,涉及到併發的地方都調用了sun.misc.Unsafe類方法進行CAS操做。

2.1 ReentrantLock

ReentrantLock是Lock的默認實現之一,須要lock和realse,若是忘記釋放鎖就會產生死鎖的問題,一般須要在finally中進行鎖的釋放。

synchronized鎖的粒度控制比較粗,同時對於實現一些鎖的狀態的轉移比較困難鎖的粒度控制比較粗,同時對於實現一些鎖的狀態的轉移比較困難。

tips

synchronized

Lock

鎖獲取超時

不支持

支持

獲取鎖響應中斷

不支持

支持

 

核心類AbstractQueuedSynchronizer,經過構造一個基於阻塞的CLH隊列容納全部的阻塞線程,而對該隊列的操做均經過Lock-Free(CAS)操做。

 

2.2 ReentrantReadWriteLock

ReentrantReadWriteLock是Lock的另外一種實現方式,咱們已經知道了ReentrantLock是一個排他鎖,同一時間只容許一個線程訪問,而ReentrantReadWriteLock容許多個讀線程同時訪問,但不容許寫線程和讀線程、寫線程和寫線程同時訪問。相對於排他鎖,提升了併發性。在實際應用中,大部分狀況下對共享數據(如緩存)的訪問都是讀操做遠多於寫操做,這時ReentrantReadWriteLock可以提供比排他鎖更好的併發性和吞吐量

3 Semaphere

Semaphore是一種在多線程環境下使用的設施,該設施負責協調各個線程,以保證它們可以正確、合理的使用公共資源的設施,也是操做系統中用於控制進程同步互斥的量。Semaphore是一種計數信號量,用於管理一組資源,內部是基於AQS的共享模式。它至關於給線程規定一個量從而控制容許活動的線程數。

4 CyclicBarrier

柵欄CyclicBarrier容許兩個或者多個線程在某個集合點同步。當一個線程到達集合點時,它將調用await()方法等待其它的線程。線程調用await()方法後,CyclicBarrier將阻塞這個線程並將它置入休眠狀態等待其它線程的到來。等最後一個線程調用await()方法時,CyclicBarrier將喚醒全部等待的線程而後這些線程將繼續執行。

5 CountDownLatch

     CountDownLatch能夠把它看做一個計數器,只不過這個計數器的操做是原子操做,同時只能有一個線程去操做這個計數器,也就是同時只能有一個線程去減這個計數器裏面的值。你能夠向CountDownLatch對象設置一個初始的數字做爲計數值,任何調用這個對象上的await()方法都會阻塞,直到這個計數器的計數值被其餘的線程減爲0爲止。

      很是典型的應用場景是:有一個任務想要往下執行,但必需要等到其餘的任務執行完畢後才能夠繼續往下執行。假如咱們這個想要繼續往下執行的任務調用一個CountDownLatch對象的await()方法,其餘的任務執行完本身的任務後調用同一個CountDownLatch對象上的countDown()方法,這個調用await()方法的任務將一直阻塞等待,直到這個CountDownLatch對象的計數值減到0爲止

6 Exchanger

用於線程間數據的交換。它提供一個同步點,在這個同步點,兩個線程能夠交換彼此的數據。這兩個線程經過exchange方法交換數據,若是第一個線程先執行exchange()方法,它會一直等待第二個線程也執行exchange方法,當兩個線程都到達同步點時,這兩個線程就能夠交換數據,將本線程生產出來的數據傳遞給對方。Exchanger 可被視爲 SynchronousQueue 的雙向形式。

可簡單地將Exchanger對象理解爲一個包含兩個格子的容器,經過exchanger方法能夠向兩個格子中填充信息。當兩個格子中的均被填充時,該對象會自動將兩個格子的信息交換,而後返回給線程,從而實現兩個線程的信息交換。

相關文章
相關標籤/搜索