突擊併發程式設計JUC系列-併發工具 Semaphore

山間木匠發表於2020-09-30

突擊併發程式設計JUC系列演示程式碼地址:
https://github.com/mtcarpenter/JavaTutorial

前面兩個章節學習了 CountDownLatchCyclicBarrier ,他們都是遞減同步器,今天學習遞增同步器 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 後端開發,會一點前端、通過持續輸出系列技術文章以文會友,如果本文能為您提供幫助,歡迎大家關注、 點贊、分享支援,我們下期再見!

相關文章