Java併發包之Semaphore信號量

信號量這個概念不太好理解

舉個解釋:

以一個停車場是運作為例。為了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛不受阻礙的進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,打開車攔,放入一輛,如果又離開兩輛,則又可以放入兩輛,如此往復。

在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。

更進一步,信號量的特性如下:信號量是一個非負整數(車位數),所有通過它的線程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處於等待狀態。在信號量上我們定義兩種操作: Wait(等待) 和 Release(釋放)。 當一個線程調用Wait(等待)操作時,它要麼通過然後將信號量減一,要麼一直等下去,直到信號量大於一或超時。Release(釋放)實際上是在信號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做“釋放”是因為加操作實際上是釋放了由信號量守護的資源。

白話文翻譯一遍:

就是Semaphore定義允許幾個線程共同訪問共同資源,比如, newSemaphore(3);

 // 獲取許可 - 最大允許3個進入,一但超過就讓其等待,除非已經釋放  semp.acquire();  // 釋放許可 -  semp.release();

在java中,還可以設置該信號量是否採用公平模式,如果以公平方式執行,則線程將會按到達的順序(FIFO)執行(也就是等待時間最長的先執行),如果是非公平,則可以後請求的有可能排在隊列的頭部。

*JDK中定義如下:Semaphore(int permits, boolean fair)

創建具有給定的許可數和給定的公平設置的Semaphore。*

分析(10個線程,最大隻允許5個訪問)

Thread pool-1-thread-1 進入當前系統的併發數是:1Thread pool-1-thread-2 進入當前系統的併發數是:2Thread pool-1-thread-3 進入當前系統的併發數是:3Thread pool-1-thread-4 進入當前系統的併發數是:4Thread pool-1-thread-5 進入當前系統的併發數是:5Thread pool-1-thread-1 即將離開Thread pool-1-thread-1 已經離開,當前系統的併發數是:4Thread pool-1-thread-6 進入當前系統的併發數是:5Thread pool-1-thread-5 即將離開Thread pool-1-thread-5 已經離開,當前系統的併發數是:4Thread pool-1-thread-7 進入當前系統的併發數是:5Thread pool-1-thread-7 即將離開Thread pool-1-thread-7 已經離開,當前系統的併發數是:4Thread pool-1-thread-8 進入當前系統的併發數是:5Thread pool-1-thread-4 即將離開Thread pool-1-thread-4 已經離開,當前系統的併發數是:4Thread pool-1-thread-9 進入當前系統的併發數是:5Thread pool-1-thread-2 即將離開Thread pool-1-thread-2 已經離開,當前系統的併發數是:4Thread pool-1-thread-10 進入當前系統的併發數是:5Thread pool-1-thread-3 即將離開Thread pool-1-thread-3 已經離開,當前系統的併發數是:4Thread pool-1-thread-10 即將離開Thread pool-1-thread-10 已經離開,當前系統的併發數是:3Thread pool-1-thread-6 即將離開Thread pool-1-thread-6 已經離開,當前系統的併發數是:2Thread pool-1-thread-8 即將離開Thread pool-1-thread-8 已經離開,當前系統的併發數是:1Thread pool-1-thread-9 即將離開Thread pool-1-thread-9 已經離開,當前系統的併發數是:0 
  • 這個例子說明了,只有5個線程進去了,當線程1離開了後,線程6才進去


分享到:


相關文章: