Java併發程式設計的藝術

weixin_34120274發表於2017-11-22

volatile:在多處理器的開發中保證了共享變數的“可見性”。一個執行緒改了一個變數,別的執行緒能馬上讀取到改之後的值。

synchonized:

對於普通同步方法,鎖是當前例項物件。

對於靜態同步方法,鎖是當前類的Class物件。

對於同步程式碼塊,鎖是括號裡的物件。

六、Java併發容器和框架

1、ConcurrentHashMap:執行緒安全且高效的HashMap

HashMap在併發執行put操作時會引起死迴圈。

HashTable使用synchonized來保證執行緒安全,效率低。

2、ConcurrentLinkedQueue:執行緒安全的佇列

非阻塞佇列。

3、BlockingQueue:阻塞佇列

有界佇列,元素滿時,想放入元素會阻塞;元素空時,想取出元素也會阻塞。

實現有:

ArrayBlockingQueue:陣列實現的有界阻塞佇列

LinkedBlockingQueue:連結串列實現的有界阻塞佇列

ProirityBlockingQueue:支援優先順序排序的無界阻塞佇列

等共7個

4、Fork、Join框架

Fork就是把一個大任務分為若干子任務並行執行;

Join就是合併這些子任務的執行結果。

八、Java中的併發工具類

1、CountDownLatch:允許等待其他執行緒完成操作

核心方法:

CountDownLatch(int) 計數器初始值

countDown( )計數器減一

await( ) 等待計數器為0,才往下執行

2、CyclicBarrier:同步屏障

讓一組執行緒到達一個屏障時被阻塞;直到最後一個執行緒到達屏障時,屏障才會開門,所有被攔截的執行緒才會繼續執行。

核心方法:

CyclicBarrier(int, Runnable),引數1表示屏障開門的執行緒數要求;引數2為屏障開門時先執行的執行緒,之後才執行被攔截的執行緒。

await( ),攔截執行緒,等待屏障開門

3、Semaphore:訊號量

Semaphore用來控制同時訪問特定資源的執行緒數量。

核心方法:

Semaphore(int),引數為資源數

acquire( ),請求資源,沒獲取到資源時,執行緒阻塞。

release( ),釋放資源

4、Exchanger:執行緒間交換資料

它提供一個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。

核心方法:

exchange(T) 

如果兩個執行緒有一個沒有執行exchange(T)方法,則會一直等待。有過載的方法,能夠設定超時時間。

十、Executor

7445574-9dc7fe696ee5c63e.JPG

FixedThreadPool:固定執行緒數的執行緒池

7445574-638ef3c45014700b.JPG

SingleThreadExecutor:單執行緒數的執行緒池

7445574-3b60178d0a519789.JPG

CachedThreadPool:根據需要建立新執行緒的執行緒池

7445574-d071a8eda9e87e05.JPG

ScheduledThreadPoolExecutor:週期執行各種任務

7445574-b8e656072b097cf1.JPG

Future介面表示非同步計算的結果。FutureTask除了實現Future介面外,還實現了Runnable介面。因此,FutureTask可以交給Executor執行。

相關文章