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

Java中的Semaphore信號(hào)量深入解析

 更新時(shí)間:2023年11月20日 10:21:02   作者:?薄情痞子?  
這篇文章主要介紹了Java中的Semaphore信號(hào)量深入解析,Semaphore是Java里面另外一個(gè)基本的并發(fā)工具包類,主要的的作用是用來(lái)保護(hù)共享資源的訪問(wèn)的,也就是僅僅允許一定數(shù)量的線程訪問(wèn)共享資源,需要的朋友可以參考下

Semaphore信號(hào)量

Semaphore是Java里面另外一個(gè)基本的并發(fā)工具包類,主要的的作用是用來(lái)保護(hù)共享資源的訪問(wèn)的,也就是僅僅允許一定數(shù)量的線程訪問(wèn)共享資源。

Semaphore維護(hù)了有限數(shù)量的許可證,只有得到了許可證的線程才能進(jìn)行共享資源的訪問(wèn),如果得不到許可證,說(shuō)明當(dāng)前共享資源的訪問(wèn)已經(jīng)達(dá)到最大限制,所以會(huì)掛起當(dāng)前線程,直到前面的線程處理完任務(wù)之后,把許可證歸還,后面排隊(duì)的線程才有機(jī)會(huì)獲取,然后處理任務(wù)。

這里面有兩個(gè)注意點(diǎn):

(1)大多數(shù)時(shí)候使用Semaphore都應(yīng)該是公平模式,默認(rèn)是非公平模式,如果需要公平模式可以在構(gòu)造函數(shù)里面指定,公平性可以 保證先進(jìn)先出,不會(huì)有線程饑餓問(wèn)題出現(xiàn),非公平模式,不保證順序,吞吐量會(huì)更好一些。

(2)共享資源的訪問(wèn),一般指的是讀取,而不是更新,這里面不要做對(duì)共享變量的修改,除非你使用同步塊來(lái)保證。

下面我們來(lái)看下Semaphore的構(gòu)造方法:

Semaphore(int permits) //非公平模式指定最大允許訪問(wèn)許可證數(shù)量
Semaphore(int permits, boolean fair)//可以通過(guò)第二個(gè)參數(shù)控制是否使用公平模

一些常用的方法:

acquire() //申請(qǐng)獲取一個(gè)許可證,如果沒(méi)有許可證,就阻塞直到能夠獲取或者被打斷
availablePermits() // 返回當(dāng)前有多少個(gè)有用的許可證數(shù)量hasQueuedThreads()//查詢是否有線程正在等待獲取許可證
drainPermits()//獲得并返回所有立即可用的許可證數(shù)量
getQueuedThreads()//返回一個(gè)List包含當(dāng)前可能正在阻塞隊(duì)列里面所有線程對(duì)象
getQueueLength()//返回當(dāng)前可能在阻塞獲取許可證線程的數(shù)量
hasQueuedThreads()//查詢是否有線程正在等待獲取許可證
isFair()//返回是否為公平模式
reducePermits(int reduction)//減少指定數(shù)量的許可證
reducePermits(int reduction)//釋放一個(gè)許可證
release(int permits)//釋放指定數(shù)量的許可證
tryAcquire()//非阻塞的獲取一個(gè)許可證

無(wú)論是Semaphore還是CountDonwLatch或者是CyclicBarrier,其實(shí)我們都可以通過(guò)Lock接口+Condition條件隊(duì)列功能來(lái)模擬實(shí)現(xiàn),但是不夠抽象所以才出現(xiàn)了AQS這個(gè)抽象的面向開(kāi)發(fā)者同步框架,比如這個(gè)Semaphore,我們看下如何使用Lock實(shí)現(xiàn):

public class SemaphoreDemo2 {
 
    private final Lock lock=new ReentrantLock(true);
    private final Condition condition=lock.newCondition();
    private int permit;
    public SemaphoreDemo2(int permit) {
        this.permit=permit;
    }
 
 
    private void acquire(){
 
        lock.lock();
        try{
            if(permit==0){
                condition.await();//如果超過(guò)限制,就進(jìn)入條件阻塞隊(duì)列
            }
            System.out.println(Thread.currentThread().getName()+"  獲得資源 .... ");
             permit--;
 
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
 
    }
 
 
    private void  release(){
        lock.lock();
        try{
            permit++;
            condition.signalAll(); //每當(dāng)有一個(gè)釋放令牌,就喚醒所有等待的線程
        }finally {
            lock.unlock();
        }
 
 
    }
 
 
}

下面我們看一下簡(jiǎn)單的使用例子:

Semaphore semaphore=new Semaphore(3);
 
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                try {
                    semaphore.acquire();
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 訪問(wèn)資源......");
                    semaphore.release();
            }
        };
 
        for (int i = 0; i < 5; i++) {
            Thread thread=new Thread(runnable);
            thread.start();
        }
 
        Thread.sleep(3000);

輸出結(jié)果:

Thread-0 訪問(wèn)資源......
Thread-1 訪問(wèn)資源......
Thread-2 訪問(wèn)資源......
Thread-4 訪問(wèn)資源......
Thread-3 訪問(wèn)資源......

注意上面的例子只有3個(gè)許可證,我們運(yùn)行了5個(gè)線程,所以同時(shí)最多只能運(yùn)行3個(gè)線程,另外兩個(gè)會(huì)阻塞直到前面的線程歸還了許可證。

Semaphore底層原理:

Semaphore底層與CountDownLatch類似都是通過(guò)AQS的共享鎖機(jī)制來(lái)實(shí)現(xiàn)的,指定的數(shù)量會(huì)設(shè)置到AQS里面的state里面,然后對(duì)于每一個(gè) 調(diào)用acquire方法線程,state都會(huì)減去一,如果state等于0,那么調(diào)用該方法的線程會(huì)被添加到同步隊(duì)列里面,同時(shí)使用 LockSupport.park方法掛起等待,知道有線程調(diào)用了release方法,會(huì)對(duì)state加1,然后喚醒共享隊(duì)列里面的線程,注意這里如果是 公平模式,就直接喚醒下一個(gè)等待線程即可,如果是非公平模式就允許新加入的線程與已有的線程進(jìn)行競(jìng)爭(zhēng),誰(shuí)先得到就是誰(shuí)的,如果新加入的 競(jìng)爭(zhēng)失敗,就會(huì)走公平模式進(jìn)入隊(duì)列排隊(duì)。

總結(jié):

本文主要介紹了并發(fā)工具包Semaphore其主要作用來(lái)限制對(duì)于共享資源的訪問(wèn),接著我們又介紹了其特點(diǎn),使用及注意事項(xiàng),然后又給出了使用其他同步工具Lock+Condition實(shí)現(xiàn)的Semaphore

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

相關(guān)文章

  • 如何解決java.lang.NoClassDefFoundError:Could not initialize class java.awt.Color問(wèn)題

    如何解決java.lang.NoClassDefFoundError:Could not initi

    文章講述了在Java服務(wù)器中處理圖形元素時(shí)遇到的常見(jiàn)問(wèn)題,即需要運(yùn)行X-server,通過(guò)在Tomcat/bin/catalina.sh中增加JAVA_OPTS環(huán)境變量并設(shè)置-Djava.awt.headless=true,可以解決這個(gè)問(wèn)題,使服務(wù)器能夠在沒(méi)有圖形界面的情況下運(yùn)行
    2024-11-11
  • java連接Access數(shù)據(jù)庫(kù)的方法

    java連接Access數(shù)據(jù)庫(kù)的方法

    這篇文章主要為大家詳細(xì)介紹了java連接Access數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • JAVA注解代碼詳解一篇就夠了

    JAVA注解代碼詳解一篇就夠了

    這篇文章主要介紹了Java注解詳細(xì)介紹,本文講解了Java注解是什么、Java注解基礎(chǔ)知識(shí)、Java注解類型、定義Java注解類型的注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • SpringBoot Starter Parent使用及說(shuō)明

    SpringBoot Starter Parent使用及說(shuō)明

    Spring Boot starter-parent提供默認(rèn)配置和依賴管理,統(tǒng)一版本控制,減少?zèng)_突,簡(jiǎn)化聲明,可通過(guò)dependencyManagement或?qū)傩愿采w版本,提升開(kāi)發(fā)效率與項(xiàng)目穩(wěn)定性
    2025-09-09
  • 關(guān)于ReentrantLock原理全面解讀

    關(guān)于ReentrantLock原理全面解讀

    這篇文章主要介紹了關(guān)于ReentrantLock原理全面解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring配置文件解析之BeanDefinitionReader詳解

    Spring配置文件解析之BeanDefinitionReader詳解

    這篇文章主要介紹了Spring配置文件解析之BeanDefinitionReader詳解,ApplicationContext.xml配置文件解析成Document對(duì)象,真正對(duì)xml中元素解析的類是在BeanDefinitionDocumentReader的實(shí)現(xiàn)類中來(lái)完成的,需要的朋友可以參考下
    2024-02-02
  • JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析

    JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析

    這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)劃分實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java多線程及分布式爬蟲(chóng)架構(gòu)原理解析

    Java多線程及分布式爬蟲(chóng)架構(gòu)原理解析

    這篇文章主要介紹了Java多線程及分布式爬蟲(chóng)架構(gòu)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 解決idea反編譯失敗無(wú)法查看jar包的源碼問(wèn)題

    解決idea反編譯失敗無(wú)法查看jar包的源碼問(wèn)題

    在IntelliJ IDEA中查看jar包源碼的兩種方法:下載反編譯軟件JD-GUI或安裝JavaBytecodeDecompiler插件
    2024-12-12
  • SpringBoot中添加監(jiān)聽(tīng)器及創(chuàng)建線程的代碼示例

    SpringBoot中添加監(jiān)聽(tīng)器及創(chuàng)建線程的代碼示例

    這篇文章主要介紹了SpringBoot中如何添加監(jiān)聽(tīng)器及創(chuàng)建線程,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

银川市| 朝阳市| 苗栗县| 高要市| 宜春市| 灵丘县| 泽库县| 郸城县| 湘乡市| 通江县| 金川县| 商水县| 长春市| 沙坪坝区| 舟山市| 桑植县| 岳普湖县| 铁岭市| 乌兰浩特市| 宁波市| 娄烦县| 临武县| 贵港市| 长阳| 东城区| 合川市| 司法| 秭归县| 兰坪| 台中市| 莫力| 南溪县| 长春市| 绥德县| 蛟河市| 元阳县| 安阳县| 桃园县| 榆树市| 威海市| 汉中市|