溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何解析Java中的Semaphore信號(hào)量

發(fā)布時(shí)間:2021-12-20 09:27:39 來(lái)源:億速云 閱讀:229 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何解析Java中的Semaphore信號(hào)量,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

Semaphore (信號(hào)量)是由計(jì)算機(jī)科學(xué)家Dijkstra在1965年提出的,廣泛應(yīng)用不同的操作系統(tǒng),在管程提出之前信號(hào)量就是并發(fā)編程領(lǐng)域的霸主!幾乎所有并發(fā)的語(yǔ)言都支持信號(hào)量機(jī)制。


Semaphore 也有被翻譯成信號(hào)燈,因?yàn)槠錂C(jī)制就像我們?nèi)粘I钪械募t綠燈,車(chē)輛的通行看紅綠燈,對(duì)應(yīng)編程世界的線程能不能執(zhí)行得看信號(hào)燈!


Semaphore 用來(lái)多線程互斥問(wèn)題,相對(duì)于synchronized和Lock來(lái)說(shuō)它允許多個(gè)線程訪問(wèn)一個(gè)臨界區(qū)!例如各種池:數(shù)據(jù)庫(kù)連接池、對(duì)象池等,這些池的需求就是同一時(shí)刻允許多個(gè)線程同時(shí)使用連接池。


Semaphore的模型可以概括為一個(gè)計(jì)數(shù)器、一個(gè)等待隊(duì)列、三個(gè)方法。三個(gè)方法原子性分別是init()、down()、up();
init():設(shè)置計(jì)數(shù)器的初始值。
down():將計(jì)數(shù)器的值減一,如果減了一之后,計(jì)數(shù)器的值小于0,則當(dāng)前的線程被阻塞,否則繼續(xù)執(zhí)行。
up():將計(jì)數(shù)器的值加一,如果加了一之后,計(jì)數(shù)器的值小于等于0,則喚醒等待隊(duì)列中的一個(gè)線程,并且將它移除出等待隊(duì)列。(注意是小于等于0,不應(yīng)該理解為大于等于0,因?yàn)榇笥诘扔?表明此時(shí)沒(méi)有等待的線程,所以不會(huì)有喚醒這個(gè)操作。)

如何解析Java中的Semaphore信號(hào)量

簡(jiǎn)單的理解就是Semaphore就是通過(guò)這三個(gè)方法來(lái)改變計(jì)數(shù)器,通過(guò)計(jì)數(shù)器的值來(lái)判斷此時(shí)的線程是應(yīng)該加入到等待隊(duì)列中等待還是成功執(zhí)行


信號(hào)量模型也被稱(chēng)為PV原語(yǔ),也就是down和up操作最早稱(chēng)為P操作和V操作,有些人還稱(chēng)為semWait和semSignal。

在JAVA中信號(hào)量模型是由 java.util.concurrent.Semaphore 的實(shí)現(xiàn),并且down和up對(duì)應(yīng)的實(shí)現(xiàn)方法是acquire和release,我們來(lái)看下簡(jiǎn)單的使用例子

如何解析Java中的Semaphore信號(hào)量

如果你想多讓幾個(gè)線程進(jìn)去臨界區(qū),那么就把Semaphore構(gòu)造器中的1改為你想要的線程數(shù)。

可以理解為頒發(fā)許可證,比如想同時(shí)允許3個(gè)線程進(jìn)入臨界區(qū),構(gòu)造器中的數(shù)就填3,理解為搞了3張?jiān)S可證,然后頒發(fā)出去,誰(shuí)拿到了許可證誰(shuí)就能進(jìn)臨界區(qū),進(jìn)入臨界區(qū)后的線程搞完事了,就歸還許可證,然后出去。


Semaphore的內(nèi)部共存在Sync、NonfairSync、FairSync三個(gè)類(lèi)。

NonfairSync與FairSync類(lèi)繼承自Sync類(lèi),Sync類(lèi)繼承自AbstractQueuedSynchronizer抽象類(lèi),也就Semaphore是依托于NonfairSync、FairSync來(lái)實(shí)現(xiàn)的。

如何解析Java中的Semaphore信號(hào)量

可以通過(guò)構(gòu)造函數(shù)來(lái)指定為公平鎖還是非公平鎖,公平的意思這個(gè)許可只會(huì)給按先來(lái)后到的順序給等待隊(duì)列中的線程。而非公平的意思就是對(duì)于任何申請(qǐng)?jiān)S可的線程,都第一時(shí)間看是否有多余的許可,如果有則給此線程。

如何解析Java中的Semaphore信號(hào)量

差別就在于有沒(méi)hasQueuedPredecessors(),這個(gè)方法就是判斷當(dāng)前線程是否是等待隊(duì)列中的頭結(jié)點(diǎn),如果不是,則不給于分配。

上述內(nèi)容就是如何解析Java中的Semaphore信號(hào)量,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI