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

Java中的Semaphore信號量詳解

 更新時間:2023年12月11日 09:12:13   作者:warybee  
這篇文章主要介紹了Java中的Semaphore信號量詳解,Semaphore(信號量)是用來控制同時訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個線程以保證合理地使用公共資源,需要的朋友可以參考下

1、介紹

Semaphore(信號量)是用來控制同時訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個線程以保證合理地使用公共資源。

Semaphore通過使用計數(shù)器來控制對共享資源的訪問。 如果計數(shù)器大于0,則允許訪問。

如果為0,則拒絕訪問。 計數(shù)器所計數(shù)的是允許訪問共享資源的許可。 因此,要訪問資源,必須從信號量中授予線程許可。

2、主要方法

  • void acquire() :從信號量獲取一個許可,如果無可用許可前將一直阻塞等待,
  • void acquire(int permits) :獲取指定數(shù)目的許可,如果無可用許可前也將會一直阻塞等待
  • boolean tryAcquire():從信號量嘗試獲取一個許可,如果無可用許可,直接返回false,不會阻塞
  • boolean tryAcquire(int permits): 嘗試獲取指定數(shù)目的許可,如果無可用許可直接返回false
  • boolean tryAcquire(int permits, long timeout, TimeUnit unit): 在指定的時間內(nèi)嘗試從信號量中獲取許可,如果在指定的時間內(nèi)獲取成功,返回true,否則返回false
  • void release():釋放一個許可,別忘了在finally中使用,注意:多次調(diào)用該方法,會使信號量的許可數(shù)增加,達到動態(tài)擴展的效果,如:初始permits為1,調(diào)用了兩次release,最大許可會改變?yōu)?
  • int availablePermits(): 獲取當前信號量可用的許可

Semaphore構(gòu)造函數(shù)

 public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }

public Semaphore(int permits, boolean fair) {
        sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }
  • permits 初始許可數(shù),也就是最大訪問線程數(shù)
  • fair 當設(shè)置為false時,創(chuàng)建的信號量為非公平鎖;當設(shè)置為true時,信號量是公平鎖

3、Semaphore登錄限流示例

在以下示例中,實現(xiàn)一個簡單的登錄隊列,通過Semaphore來限制系統(tǒng)中的用戶數(shù):

public static void main(String[] args) {
        //允許最大的登錄數(shù)
        int slots=10;
        ExecutorService executorService = Executors.newFixedThreadPool(slots);
        LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots);
        //線程池模擬登錄
        for (int i = 1; i <= slots; i++) {
            final int num=i;
            executorService.execute(()->{
                 if (loginQueue.tryLogin()){
                     System.out.println("用戶:"+num+"登錄成功!");
                 }else {
                     System.out.println("用戶:"+num+"登錄失?。?);
                 }
            });
        }
        executorService.shutdown();
        System.out.println("當前可用許可證數(shù):"+loginQueue.availableSlots());
        //此時已經(jīng)登錄了10個用戶,再次登錄的時候會返回false
        if (loginQueue.tryLogin()){
            System.out.println("登錄成功!");
        }else {
            System.out.println("系統(tǒng)登錄用戶已滿,登錄失??!");
        }
        //有用戶退出登錄
        loginQueue.logout();
        //再次登錄
        if (loginQueue.tryLogin()){
            System.out.println("登錄成功!");
        }else {
            System.out.println("系統(tǒng)登錄用戶已滿,登錄失?。?);
        }
    }
class LoginQueueUsingSemaphore{

    private Semaphore semaphore;

    /**
     *
     * @param slotLimit
     */
    public LoginQueueUsingSemaphore(int slotLimit){
        semaphore=new Semaphore(slotLimit);
    }

    boolean tryLogin() {
        //獲取一個憑證
        return semaphore.tryAcquire();
    }

    void logout() {
        semaphore.release();
    }

    int availableSlots() {
        return semaphore.availablePermits();
    }
}

運行結(jié)果:

在這里插入圖片描述

到此這篇關(guān)于Java中的Semaphore信號量詳解的文章就介紹到這了,更多相關(guān)Semaphore信號量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用IDEA快速生成實體類

    如何利用IDEA快速生成實體類

    這篇文章主要介紹了如何利用IDEA快速生成實體類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java多線程與線程池技術(shù)分享

    Java多線程與線程池技術(shù)分享

    這篇文章主要介紹了Java多線程與線程池技術(shù)分享,線程池本質(zhì)是池化技術(shù)的應(yīng)用,和連接池類似,創(chuàng)建連接與關(guān)閉連接屬于耗時操作,下文相關(guān)介紹需要的小伙伴可以參考一下
    2022-03-03
  • 淺談JAVA 責任鏈模式

    淺談JAVA 責任鏈模式

    這篇文章主要介紹了JAVA 責任鏈模式的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • JVM入門之JVM內(nèi)存結(jié)構(gòu)內(nèi)容詳解

    JVM入門之JVM內(nèi)存結(jié)構(gòu)內(nèi)容詳解

    這篇文章主要介紹了JVM入門之JVM內(nèi)存結(jié)構(gòu)內(nèi)容詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

    這篇文章主要為大家介紹了最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 詳解Spring注解@Validated 失效分析

    詳解Spring注解@Validated 失效分析

    這篇文章主要介紹了Spring注解@Validated失效分析,文中有詳細代碼示例講解了@Validated為何失效,需要的小伙伴可以參考一下
    2023-04-04
  • Spring Boot實現(xiàn)微信小程序登錄

    Spring Boot實現(xiàn)微信小程序登錄

    這篇文章主要為大家詳細介紹了Spring Boot實現(xiàn)微信小程序登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • SpringBoot實現(xiàn)整合微信支付方法詳解

    SpringBoot實現(xiàn)整合微信支付方法詳解

    這篇文章主要介紹了SpringBoot實現(xiàn)整合微信支付的過程詳解,文中的示例代碼對我們的工作或?qū)W習有一定的幫助,感興趣的小伙伴可以跟隨小編學習一下
    2021-12-12
  • JDBC連接MySQL數(shù)據(jù)庫批量插入數(shù)據(jù)過程詳解

    JDBC連接MySQL數(shù)據(jù)庫批量插入數(shù)據(jù)過程詳解

    這篇文章主要介紹了JDBC連接MySQL數(shù)據(jù)庫批量插入數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java手機號、郵箱、日期正則表達式實例代碼

    java手機號、郵箱、日期正則表達式實例代碼

    在Java編程領(lǐng)域中,正則表達式被視為一種高效的文本處理手段,經(jīng)常被應(yīng)用于檢測字符串是否符合特定的格式要求,這篇文章主要介紹了java手機號、郵箱、日期正則表達式的相關(guān)資料,需要的朋友可以參考下
    2026-01-01

最新評論

乳源| 萍乡市| 丹棱县| 简阳市| 平和县| 志丹县| 如皋市| 忻城县| 甘南县| 黎川县| 缙云县| 正阳县| 新田县| 兴业县| 湘阴县| 泗水县| 仪征市| 沧州市| 昆明市| 宁津县| 江华| 呼图壁县| 托里县| 从化市| 行唐县| 平江县| 沈阳市| 德江县| 辽阳县| 册亨县| 峨边| 汝阳县| 夏河县| 湖北省| 河北省| 东安县| 汉阴县| 阿荣旗| 象山县| 万山特区| 兴隆县|