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

Java中的Semaphore信號(hào)量詳解

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

1、介紹

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

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

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

2、主要方法

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

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 當(dāng)設(shè)置為false時(shí),創(chuàng)建的信號(hào)量為非公平鎖;當(dāng)設(shè)置為true時(shí),信號(hào)量是公平鎖

3、Semaphore登錄限流示例

在以下示例中,實(shí)現(xiàn)一個(gè)簡單的登錄隊(duì)列,通過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("當(dāng)前可用許可證數(shù):"+loginQueue.availableSlots());
        //此時(shí)已經(jīng)登錄了10個(gè)用戶,再次登錄的時(shí)候會(huì)返回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() {
        //獲取一個(gè)憑證
        return semaphore.tryAcquire();
    }

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

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

運(yùn)行結(jié)果:

在這里插入圖片描述

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

相關(guān)文章

  • 如何利用IDEA快速生成實(shí)體類

    如何利用IDEA快速生成實(shí)體類

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

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

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

    淺談JAVA 責(zé)任鏈模式

    這篇文章主要介紹了JAVA 責(zé)任鏈模式的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    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)容詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 最安全的加密算法Bcrypt防止數(shù)據(jù)泄露詳解

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

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

    詳解Spring注解@Validated 失效分析

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

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

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

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

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

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

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

    java手機(jī)號(hào)、郵箱、日期正則表達(dá)式實(shí)例代碼

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

最新評論

沙坪坝区| 商都县| 威远县| 霍林郭勒市| 马山县| 突泉县| 乌苏市| 二连浩特市| 永顺县| 合山市| 二连浩特市| 闽清县| 巫溪县| 西贡区| 宁南县| 松阳县| 洛浦县| 宁国市| 金乡县| 西乌珠穆沁旗| 梁河县| 绍兴市| 赣榆县| 安福县| 类乌齐县| 来安县| 巨鹿县| 遂宁市| 麻阳| 兰考县| 上饶县| 石门县| 衡阳县| 江陵县| SHOW| 临漳县| 浑源县| 栖霞市| 泰州市| 肥西县| 巧家县|