亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

簡介

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

Semaphored的使用

構(gòu)造方法

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

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

核心方法

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

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

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

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

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

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

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

示例

總共有5個(gè)許可證,最先獲取到許可證的5個(gè)線程開始執(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{
                //獲取一個(gè)許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)...");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個(gè)許可證
                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實(shí)現(xiàn)互斥

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

Semaphore semaphore = new Semaphore(1);

相比內(nèi)置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實(shí)現(xiàn)互斥有個(gè)明顯的缺點(diǎ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 {
                //獲取一個(gè)許可證
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)A...");
                semaphore.acquire();
                System.out.println(threadName + "執(zhí)行任務(wù)B...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //釋放一個(gè)許可證
                semaphore.release();
            }
        };

        new Thread(runnable).start();
    }

}

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

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

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

相關(guān)文章

  • JVM加載一個(gè)類的過程

    JVM加載一個(gè)類的過程

    本文主要介紹了JVM加載一個(gè)類的過程。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Java咖啡館(1)——嘆咖啡

    Java咖啡館(1)——嘆咖啡

    這篇文章主要給大家介紹了關(guān)于Java咖啡館之嘆咖啡,需要的朋友可以參考下
    2006-12-12
  • 使用Java填充Word模板的方法詳解

    使用Java填充Word模板的方法詳解

    Java填充Word模板是一種將動(dòng)態(tài)數(shù)據(jù)插入到Word文檔模板中生成最終文檔的過程,通常用于批量創(chuàng)建包含個(gè)人信息、報(bào)告結(jié)果或其他動(dòng)態(tài)內(nèi)容的文檔,本文給大家介紹了使用Java填充Word模板的方法,需要的朋友可以參考下
    2024-07-07
  • Java如何基于反射獲取對(duì)象屬性信息

    Java如何基于反射獲取對(duì)象屬性信息

    這篇文章主要介紹了Java如何基于反射獲取對(duì)象屬性信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯

    java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯

    這篇文章主要介紹了java利用JEXL實(shí)現(xiàn)動(dòng)態(tài)表達(dá)式編譯,系統(tǒng)要獲取多個(gè)數(shù)據(jù)源的數(shù)據(jù),并進(jìn)行處理,最后輸出多個(gè)字段。字段的計(jì)算規(guī)則一般是簡單的取值最多加一點(diǎn)條件判斷,下面是具體的實(shí)現(xiàn)方法
    2021-04-04
  • Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信的教程詳解

    Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信的教程詳解

    WebSocket?是基于TCP/IP協(xié)議,獨(dú)立于HTTP協(xié)議的通信協(xié)議,本文將使用Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能,有需要的小伙伴可以參考一下
    2024-01-01
  • Java彈簧布局管理器使用方法詳解

    Java彈簧布局管理器使用方法詳解

    這篇文章主要介紹了Java彈簧布局管理器使用方法詳解,需要的朋友可以參考下
    2017-09-09
  • SpringBoot之Java配置的實(shí)現(xiàn)

    SpringBoot之Java配置的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot之Java配置的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java使用阿里云接口進(jìn)行身份證實(shí)名認(rèn)證的示例實(shí)現(xiàn)

    Java使用阿里云接口進(jìn)行身份證實(shí)名認(rèn)證的示例實(shí)現(xiàn)

    這篇文章主要介紹了使用阿里云接口進(jìn)行身份證實(shí)名認(rèn)證的示例實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 簡單分析Java的求值策略原理

    簡單分析Java的求值策略原理

    在本篇文章里小編給大家整理的是一篇關(guān)于簡單分析Java的求值策略原理內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-06-06

最新評(píng)論