突擊併發程式設計JUC系列-併發工具 Semaphore
突擊併發程式設計JUC系列演示程式碼地址:
https://github.com/mtcarpenter/JavaTutorial
前面兩個章節學習了 CountDownLatch
和 CyclicBarrier
,他們都是遞減同步器,今天學習遞增同步器 Semaphore
。
Semaphore
(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。看到這個訊號量我的腦海中就出現了紅綠燈,為了保證學生的安全,學校的十字路口一般都設有紅綠燈,車流量控制,每一次綠燈同時能通行 100 輛汽車,沒有在綠燈通行的汽車都會被阻塞,直到下一次綠燈。
新日學校植樹節活動,植樹節地點中途必須通過一個紅綠燈的十字路口,紅綠燈的十字路口每次時間有限,一次紅綠燈的時間只能通過兩個年級的同學,示例如下:
public class SemaphoreExample1 {
private final static int gradeNum = 6;
private static Semaphore semaphore = new Semaphore(2);
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newScheduledThreadPool(gradeNum);
System.out.println("校門口紅綠燈等待中.....");
for (int i = 0; i < gradeNum; i++) {
int gradeName = i + 1;
exec.submit(() -> {
try {
// 獲取一個許可
semaphore.acquire();
wait(gradeName);
// 釋放一個許可
semaphore.release();
} catch (Exception e) {
}
});
}
exec.shutdown();
}
private static void wait(int gradeName) throws Exception {
TimeUnit.SECONDS.sleep(1);
System.out.println(gradeName + "年級通過紅綠燈......");
}
}
執行結果如下:
校門口紅綠燈等待中.....
1年級通過紅綠燈......
2年級通過紅綠燈......
4年級通過紅綠燈......
3年級通過紅綠燈......
5年級通過紅綠燈......
6年級通過紅綠燈......
大家執行此段程式碼會發現控制檯,兩個子執行緒同時列印。
歡迎關注公眾號 山間木匠 , 我是小春哥,從事 Java 後端開發,會一點前端、通過持續輸出系列技術文章以文會友,如果本文能為您提供幫助,歡迎大家關注、 點贊、分享支援,我們下期再見!
相關文章
- JUC併發程式設計之Semaphore、CountDownLatch、CyclicBarrier協同工具程式設計CountDownLatch
- 併發程式設計之:JUC併發控制工具程式設計
- Java併發系列—工具類:SemaphoreJava
- Java併發程式設計系列之Semaphore詳解Java程式設計
- 併發工具類——Semaphore
- java併發程式設計系列原理篇--JDK中的通訊工具類SemaphoreJava程式設計JDK
- JUC併發系列(八):併發程式設計常用輔助類CountDownLatch與CyclicBarrier(手敲程式碼示例)程式設計CountDownLatch
- java併發程式設計工具類JUC第八篇:ConcurrentHashMapJava程式設計HashMap
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueueJava程式設計BloC
- Java 併發程式設計(十五) -- Semaphore原始碼分析Java程式設計原始碼
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- JUC併發程式設計詳解(通俗易懂)程式設計
- 《java併發程式設計的藝術》併發工具類Java程式設計
- Java併發程式設計序列之JUC底層AQSJava程式設計AQS
- JUC 常用4大併發工具類
- Python併發程式設計系列之多程式(multiprocessing)Python程式設計
- Go 併發程式設計 - 併發安全(二)Go程式設計
- 併發模擬-程式碼CountDownLatch,SemaphoreCountDownLatch
- 併發程式設計程式設計
- 併發工具類:Semaphore原始碼解讀原始碼
- Java 併發工具類 CountDownLatch、CyclicBarrier、Semaphore、ExchangerJavaCountDownLatch
- java併發程式設計工具類JUC第三篇:DelayQueue延時佇列Java程式設計佇列
- java併發程式設計工具類JUC第一篇:BlockingQueue阻塞佇列Java程式設計BloC佇列
- JUC併發程式設計學習(五)集合類不安全程式設計
- JUC併發程式設計學習筆記(六)Callable(簡單)程式設計筆記
- JUC併發程式設計基石AQS原始碼之結構篇程式設計AQS原始碼
- java併發程式設計JUC第十二篇:AtomicInteger原子整型Java程式設計
- Doug Lea併發設計模式(JUC學習前奏)設計模式
- Java併發程式設計-鎖及併發容器Java程式設計
- 併發程式設計(二)——併發類容器ConcurrentMap程式設計
- 我們們來聊聊併發工具類Semaphore
- 大白話說java併發工具類-Semaphore,ExchangerJava
- java 併發程式設計Java程式設計
- 併發程式設計—— LinkedTransferQueue程式設計
- 併發程式設計(ReentrantLock)程式設計ReentrantLock
- Go 併發程式設計Go程式設計
- golang併發程式設計Golang程式設計
- Golang 併發程式設計Golang程式設計