日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

發布時間:2024/7/5 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前談過高并發編程系列:4種常用Java線程鎖的特點,性能比較、使用場景?,以及高并發編程系列:ConcurrentHashMap的實現原理(JDK1.7和JDK1.8)?

今天主要介紹concurrent包的內容以及4大并發工具類。

Java并發工具包

1.并發工具類

提供了比synchronized更加高級的各種同步結構:包括CountDownLatch、CyclicBarrier、Semaphore等,可以實現更加豐富的多線程操作。


2.并發容器

提供各種線程安全的容器:最常見的ConcurrentHashMap、有序的ConcurrentSkipListMap,實現線程安全的動態數組CopyOnWriteArrayList等。


3.并發隊列

各種BlockingQueue的實現:常用的ArrayBlockingQueue、SynchorousQueue或針對特定場景的PriorityBlockingQueue。


4.Executor框架

可以創建各種不同類型的線程池,調度任務運行等,絕大部分情況下,不再需要自己從頭實現線程池和任務調度器。

Java常用的并發容器

1.ConcurrentHashMap

經常使用的并發容器,JDK 1.7和1.8的底層數據結構發生了變化(后續文章會詳解),這里可以建議學習順序如下:從Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap,這樣可以更好的掌握這個并發容器,畢竟都是從HashMap進化而來。


2.ConcurrentSkipListMap

在乎順序,需要對數據進行非常頻繁的修改


3.CopyOnWrite容器

CopyOnWrite容器即寫時復制的容器。從JDK1.5開始Java并發包里提供了兩個使用CopyOnWrite機制實現的并發容器,CopyOnWriteArrayList和CopyOnWriteArraySet。


4.各種并發隊列的實現

如各種BlockedQueue實現,比較典型的ArrayBlockingQueue、SynchorousQueue。


詳情請看:高并發編程系列:并發容器的原理,7大并發容器詳解、及使用場景

Java常用的并發工具類

1.CountDownLatch


1)功能

CountDownLatch是一個同步的輔助類,允許一個或多個線程,等待其他一組線程完成操作,再繼續執行。


2)原理

  • CountDownLatch是通過一個計數器來實現的,計數器的初始值為需要等待線程的數量。

eg:CountDownLatch c = new CountDownLatch(10); // 等待線程的數量為10

  • 主線程調用CountDownLatch的await()方法會阻塞當前線程(即:主線程在閉鎖上等待),直到計數器的值為0。
  • 當一個工作線程完成了自己的任務后,調用CountDownLatch的countDown()方法,計數器的值就會減1。
  • 當計數器值為0時,說明所有的工作線程都執行完了,此時,在閉鎖上等待的主線程就可以恢復執行任務。

3)應用場景

倒數計時器

例如:一種典型的場景就是火箭發射。在火箭發射前,為了保證萬無一失,往往還要進行各項設備、儀器的檢查。 只有等所有檢查完畢后,引擎才能點火。這種場景就非常適合使用CountDownLatch。

它可以使得點火線程,等待所有檢查線程全部完工后,再執行


4)使用方式

static final CountDownLatch end = new CountDownLatch(10); end.countDown(); end.await();


5)示意圖:


2.CyclicBarrier


1)功能:

CyclicBarrier的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運行。

和CountDownLatch相似,也是等待某些線程都做完以后再執行。


2)與CountDownLatch區別

在于這個計數器可以反復使用。比如,假設我們將計數器設置為10。那么湊齊第一批1 0個線程后,計數器就會歸零,然后接著湊齊下一批10個線程。


3)原理

1)CyclicBarrier是通過一個計數器來實現的,計數器的初始值為需要等待線程的數量。eg:CyclicBarrier c = new CyclicBarrier(2); // 等待線程的數量為2

2)每個線程調用CyclicBarrier的await()方法,使自己進入等待狀態。

3)當所有的線程都調用了CyclicBarrier的await()方法后,所有的線程停止等待,繼續運行。


4)使用方式

public CyclicBarrier(int parties, Runnable barrierAction) barrierAction就是當計數器一次計數完成后,系統會執行的動作 await()

5)示意圖:


3.信號量Semaphore


1)功:Java提供了經典信號量Semaphore的實現,它通過控制一定數量的許可(permit)的方式,來達到限制通用資源訪問的目的。例如:控制并發的線程數。


2)原理:

1)Semaphore是通過一個計數器(記錄許可證的數量)來實現的,計數器的初始值為需要等待線程的數量。

eg:Semaphore s = new Semaphore(10); // 線程最大的并發數為10

2)線程通過acquire()方法獲取許可證(計數器的值減1),只有獲取到許可證才可以繼續執行下去,否則阻塞當前線程。

3)線程通過release()方法歸還許可證(計數器的值加1)。

說明:使用tryAcquire()方法可以立即得到執行的結果:嘗試獲取一個許可證,若獲取成功,則立即返回true,若獲取失敗,則立即返回false。


3)應用場景:

Semaphore可以用于做流量控制,特別是公用資源有限的應用場景,比如數據庫連接。

舉一個場景:例如在車站、機場等出租車時,當很多空出租車就位時,為防止過度擁擠,調度員指揮排隊等待坐車的隊伍一次進來5個人上車,等這5個人坐車出發,再放進去下一批。這和Semaphore的工作原理有些類似。


4.交換者Exchanger


1)功能:Exchanger(交換者)是一個用于線程間協作的工具類。Exchanger用于進行線程間的數據交換。它提供一個同步點,在這個同步點兩個線程可以交換彼此的數據。這兩個線程通過exchange方法交換數據,
如果第一個線程先執行exchange方法,它會一直等待第二個線程也執行exchange,當兩個線程都到達同步點時,這兩個線程就可以交換數據,將本線程生產出來的數據傳遞給對方。


2)原理

線程A調用public V exchange(V dataA)方法,線程A到達同步點,并且在線程B到達同步點前一直等待。

線程B調用public V exchange(V dataB)方法,線程B到達同步點。

線程A與線程B都達到同步點時,線程將自己的數據傳遞給對方,兩個線程完成了數據的交換了。


3)Exchanger的應用場景

Exchanger可以用于校對工作的場景。

你可能也喜歡:

  • Java多線程系列(七):并發容器的原理,7大并發容器詳解、及使用場景
  • Java多線程系列(十一):ReentrantReadWriteLock的實現原理與鎖獲取詳解
  • Java多線程與并發系列從0到1全部合集,強烈建議收藏!
  • Java多線程系列(四):4種常用Java線程鎖的特點,性能比較、使用場景
  • Java多線程系列(一):最全面的Java多線程學習概述
  • Java多線程系列(六):深入詳解Synchronized同步鎖的底層實現

  • 總結

    以上是生活随笔為你收集整理的Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。