突擊併發編程JUC系列演示代碼地址: https://github.com/mtcarpenter/JavaTutorial前端
前面兩個章節學習了 CountDownLatch
和 CyclicBarrier
,他們都是遞減同步器,今天學習遞增同步器 Semaphore
。 Semaphore
(信號量)是用來控制同時訪問特定資源的線程數量,它經過協調各個線程,以保證合理的使用公共資源。看到這個信號量個人腦海中就出現了紅綠燈,爲了保證學生的安全,學校的十字路口通常都設有紅綠燈,車流量控制,每一次綠燈同時能通行 100 輛汽車,沒有在綠燈通行的汽車都會被阻塞,直到下一次綠燈。java
新日學校植樹節活動,植樹節地點中途必須經過一個紅綠燈的十字路口,紅綠燈的十字路口每次時間有限,一次紅綠燈的時間只能經過兩個年級的同窗,示例以下:git
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 + "年級經過紅綠燈......"); } }
運行結果以下:github
校門口紅綠燈等待中..... 1年級經過紅綠燈...... 2年級經過紅綠燈...... 4年級經過紅綠燈...... 3年級經過紅綠燈...... 5年級經過紅綠燈...... 6年級經過紅綠燈......
你們運行此段代碼會發現控制檯,兩個子線程同時打印。編程
歡迎關注公衆號 山間木匠 , 我是小春哥,從事 Java 後端開發,會一點前端、經過持續輸出系列技術文章以文會友,若是本文能爲您提供幫助,歡迎你們關注、點贊、分享支持,咱們下期再見!<br />後端