最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程之Semaphore的使用簡介

 更新時間:2021年04月20日 09:55:58   作者:布禾  
這篇文章主要介紹了Java并發(fā)編程之Semaphore的使用簡介,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

簡介

Semaphore是用來限制訪問特定資源的并發(fā)線程的數(shù)量,相對于內(nèi)置鎖synchronized和重入鎖ReentrantLock的互斥性來說,Semaphore可以允許多個線程同時訪問共享資源。

Semaphored的使用

構(gòu)造方法

Semaphore(int permits):創(chuàng)建Semaphore,并指定許可證的數(shù)量。(公平策略為非公平)

Semaphore(int permits, boolean fair):創(chuàng)建Semaphore,并指定許可證的數(shù)量和公平策略。

核心方法

acquire():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證或者當(dāng)前線程被中斷。

acquire(int permits):從Semaphore中獲取指定數(shù)量的許可證,如果獲取不到則阻塞等待,直到其他線程釋放了對應(yīng)數(shù)量的許可證或者當(dāng)前線程被中斷。

acquireUninterruptibly():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證。(不響應(yīng)中斷)

tryAcquire():嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則返回false,不會進(jìn)行等待。(不受公平策略的影響,許可證可用則立即獲得)

tryAcquire(long timeout, TimeUnit unit):嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則等待指定的時間,直到等待時間結(jié)束還是沒有獲取到許可證則返回false。

release():釋放一個許可證。

release(int permits):釋放指定數(shù)量的許可證。

示例

總共有5個許可證,最先獲取到許可證的5個線程開始執(zhí)行任務(wù),沒獲取到的線程進(jìn)入等待狀態(tài),直到獲取到許可證的線程釋放許可證后,再獲取許可證執(zhí)行任務(wù)。

public class Demo {

    public static void main(String[] args) {
        //創(chuàng)建許可證數(shù)量為5的Semaphore
        Semaphore semaphore = new Semaphore(5);

        Runnable runnable = () -> {
            String threadName = Thread.currentThread().getName();
            try{
                //獲取一個許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)...");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個許可證
                semaphore.release();
            }
        };

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i = 0; i < 10; i++){
            executorService.execute(runnable);
        }

        executorService.shutdown();
    }

}

/* 開始輸出:
 * pool-1-thread-1執(zhí)行任務(wù)...
 * pool-1-thread-5執(zhí)行任務(wù)...
 * pool-1-thread-6執(zhí)行任務(wù)...
 * pool-1-thread-7執(zhí)行任務(wù)...
 * pool-1-thread-3執(zhí)行任務(wù)...
 * 三秒后輸出:
 * pool-1-thread-4執(zhí)行任務(wù)...
 * pool-1-thread-8執(zhí)行任務(wù)...
 * pool-1-thread-2執(zhí)行任務(wù)...
 * pool-1-thread-10執(zhí)行任務(wù)...
 * pool-1-thread-9執(zhí)行任務(wù)...
 */

使用Semaphore實現(xiàn)互斥

使用Semaphore實現(xiàn)互斥只需要將許可證數(shù)量設(shè)置為1,這樣就可以保證只有一個線程能獲取到許可證。

Semaphore semaphore = new Semaphore(1);

相比內(nèi)置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實現(xiàn)互斥有個明顯的缺點:不可重入,沒有釋放許可證的情況下,再次調(diào)acquire方法將導(dǎo)致死鎖。

示例:

public class Demo {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(1);

        Runnable runnable = () -> {
            String threadName = Thread.currentThread().getName();
            try {
                //獲取一個許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)A...");
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)B...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個許可證
                semaphore.release();
            }
        };

        new Thread(runnable).start();
    }

}

/*
 * 輸出結(jié)果:
 * Thread-0執(zhí)行任務(wù)A...
 */

“執(zhí)行任務(wù)B”永遠(yuǎn)不會打印,因為許可證只有一個,第二次acquire方法的調(diào)用會因為無法獲取到許可證而一直阻塞。

以上就是Java并發(fā)編程之Semaphore的使用簡介的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)編程之Semaphore的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 通過Java帶你了解網(wǎng)絡(luò)IO模型

    通過Java帶你了解網(wǎng)絡(luò)IO模型

    這篇文章將通過Java帶大家了解網(wǎng)絡(luò)IO模型,包括BIO,NoBlockingIO,NIO(NewIO),AIO等做了詳細(xì)得介紹,感興趣的小伙伴可以參考閱讀本文
    2023-05-05
  • 詳解SpringBean基于XML的裝配

    詳解SpringBean基于XML的裝配

    Bean的裝配可以理解為依賴關(guān)系注入,Bean的裝配方式也就是Bean 的依賴注入方式.Spring容器支持多種形式的Bean的裝配方式,如基于XML的Bean裝配,基于Annotation的Bean裝配和自動裝配等.本文就帶大家了解SpringBean基于XML的裝配,需要的朋友可以參考下
    2021-05-05
  • Spring Cloud構(gòu)建Eureka應(yīng)用的方法

    Spring Cloud構(gòu)建Eureka應(yīng)用的方法

    這篇文章主要介紹了Spring Cloud構(gòu)建Eureka應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解

    在Java當(dāng)中synchronized關(guān)鍵字通常是用來標(biāo)記一個方法或者代碼塊。本文將通過示例為大家詳細(xì)介紹一下Synchronized的各種使用方法,需要的可以參考一下
    2022-08-08
  • java_IO向文件中寫入和讀取內(nèi)容代碼實例

    java_IO向文件中寫入和讀取內(nèi)容代碼實例

    這篇文章主要介紹了java_IO向文件中寫入和讀取內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • javax NotBlank和Email注解失效的解決

    javax NotBlank和Email注解失效的解決

    這篇文章主要介紹了javax NotBlank和Email注解失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • maven+springboot打成jar包的方法

    maven+springboot打成jar包的方法

    這篇文章主要介紹了maven+springboot打成jar包的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • Groovy的規(guī)則腳本引擎實例解讀

    Groovy的規(guī)則腳本引擎實例解讀

    這篇文章主要介紹了Groovy的規(guī)則腳本引擎實例解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java中break和continue區(qū)別及使用場合分析

    java中break和continue區(qū)別及使用場合分析

    本文力圖通過實例加使用場合詳解來引導(dǎo)菜鳥重新認(rèn)識break和continue語句,需要的朋友可以參考下
    2014-01-01
  • Java實現(xiàn)快速排序算法的完整示例

    Java實現(xiàn)快速排序算法的完整示例

    這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)快速排序算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

瑞安市| 南江县| 大余县| 达拉特旗| 孟州市| 新乐市| 酉阳| 枣强县| 尉犁县| 汉源县| 修水县| 祁门县| 吉木乃县| 科技| 开原市| 牟定县| 福泉市| 都匀市| 荆州市| 犍为县| 宜都市| 东辽县| 西乌珠穆沁旗| 千阳县| 奇台县| 峨边| 新丰县| 鲁甸县| 且末县| 微山县| 周宁县| 连山| 开封县| 抚宁县| 轮台县| 聂荣县| 海宁市| 云龙县| 扎赉特旗| 都江堰市| 新巴尔虎左旗|