信號(hào)量這個(gè)概念不太好理解
舉個(gè)??解釋:
以一個(gè)停車場(chǎng)是運(yùn)作為例悼尾。為了簡(jiǎn)單起見梭灿,假設(shè)停車場(chǎng)只有三個(gè)車位阴汇,一開始三個(gè)車位都是空的遭垛。這時(shí)如果同時(shí)來了五輛車尼桶,看門人允許其中三輛不受阻礙的進(jìn)入,然后放下車攔锯仪,剩下的車則必須在入口等待泵督,此后來的車也都不得不在入口處等待。這時(shí)庶喜,有一輛車離開停車場(chǎng)小腊,看門人得知后,打開車攔久窟,放入一輛秩冈,如果又離開兩輛,則又可以放入兩輛斥扛,如此往復(fù)入问。
在這個(gè)停車場(chǎng)系統(tǒng)中,車位是公共資源稀颁,每輛車好比一個(gè)線程芬失,看門人起的就是信號(hào)量的作用。
更進(jìn)一步匾灶,信號(hào)量的特性如下:信號(hào)量是一個(gè)非負(fù)整數(shù)(車位數(shù))棱烂,所有通過它的線程(車輛)都會(huì)將該整數(shù)減一(通過它當(dāng)然是為了使用資源),當(dāng)該整數(shù)值為零時(shí)粘昨,所有試圖通過它的線程都將處于等待狀態(tài)垢啼。在信號(hào)量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。 當(dāng)一個(gè)線程調(diào)用Wait(等待)操作時(shí)张肾,它要么通過然后將信號(hào)量減一芭析,要么一直等下去,直到信號(hào)量大于一或超時(shí)吞瞪。Release(釋放)實(shí)際上是在信號(hào)量上執(zhí)行加操作馁启,對(duì)應(yīng)于車輛離開停車場(chǎng),該操作之所以叫做“釋放”是因?yàn)榧硬僮鲗?shí)際上是釋放了由信號(hào)量守護(hù)的資源。
白話文翻譯一遍:
就是Semaphore定義允許幾個(gè)線程共同訪問共同資源惯疙,比如翠勉,new Semaphore(3);
// 獲取許可 - 最大允許3個(gè)進(jìn)入,一但超過就讓其等待,除非已經(jīng)釋放
semp.acquire();
// 釋放許可 -
semp.release();
在java中霉颠,還可以設(shè)置該信號(hào)量是否采用公平模式对碌,如果以公平方式執(zhí)行,則線程將會(huì)按到達(dá)的順序(FIFO)執(zhí)行(也就是等待時(shí)間最長(zhǎng)的先執(zhí)行)蒿偎,如果是非公平朽们,則可以后請(qǐng)求的有可能排在隊(duì)列的頭部。
*JDK中定義如下:
Semaphore(int permits, boolean fair)
創(chuàng)建具有給定的許可數(shù)和給定的公平設(shè)置的Semaphore诉位。*
分析(10個(gè)線程骑脱,最大只允許5個(gè)訪問)
Thread pool-1-thread-1 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:1
Thread pool-1-thread-2 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:2
Thread pool-1-thread-3 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:3
Thread pool-1-thread-4 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-5 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-1 即將離開
Thread pool-1-thread-1 已經(jīng)離開,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-6 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-5 即將離開
Thread pool-1-thread-5 已經(jīng)離開苍糠,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-7 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-7 即將離開
Thread pool-1-thread-7 已經(jīng)離開叁丧,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-8 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-4 即將離開
Thread pool-1-thread-4 已經(jīng)離開,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-9 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-2 即將離開
Thread pool-1-thread-2 已經(jīng)離開岳瞭,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-10 進(jìn)入當(dāng)前系統(tǒng)的并發(fā)數(shù)是:5
Thread pool-1-thread-3 即將離開
Thread pool-1-thread-3 已經(jīng)離開拥娄,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:4
Thread pool-1-thread-10 即將離開
Thread pool-1-thread-10 已經(jīng)離開,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:3
Thread pool-1-thread-6 即將離開
Thread pool-1-thread-6 已經(jīng)離開寝优,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:2
Thread pool-1-thread-8 即將離開
Thread pool-1-thread-8 已經(jīng)離開条舔,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:1
Thread pool-1-thread-9 即將離開
Thread pool-1-thread-9 已經(jīng)離開枫耳,當(dāng)前系統(tǒng)的并發(fā)數(shù)是:0
- 這個(gè)例子說明了乏矾,只有5個(gè)線程進(jìn)去了,當(dāng)線程1離開了后迁杨,線程6才進(jìn)去