一、用法
訊號量,semaphore可以控同時訪問的執行緒個數,通過 acquire() 獲取乙個許可,如果沒有就等待,而 release() 釋放乙個許可。
二、原始碼:
構造方法,設定可以同時執行的執行緒數量。這裡可以設定是公平的,還是非公平的。這裡先說非公平的。
acqurie()
本質是aqs的方法,
這個方法的本質就是看業務線的try的方法是否返回值小於0,如果是,就掛起這個執行緒。
而這個try方法是看上述這個方法返回值是否大於等於0。
這個方法就是每次呼叫acquire的時候就把併發數見一,當減到負數的時候,就會去執行掛起執行緒的方法了。這也就滿足了之前使用規則,只有滿足要求規定的併發數的執行緒能執行,其他執行緒等待。
這裡的公平只有乙個區別
在獲取state鎖的時候,看等待佇列是不是為空或者自己是等待佇列的頭結點如果是,就可以獲得state鎖,如果不是,,就老老實實入隊吧。所以這個是公平的。具體可以參考(reetrantlock看aqs那篇文章)
是否許可的本質就是呼叫tryreleaseshared方法
這個方法就是根據想要釋放的許可數量,把state的值加上幾。之後會有doreleaeshared方法喚醒head下第乙個需要被喚醒的節點。
這裡很多東西都沒有細述了,因為關於aqs部分在前面文章都說了,理解了前面的,這個就很簡單。
訊號量semaphore解析
1 基礎概念 訊號量在建立時須要設定乙個初始值,表示同一時候能夠有幾個任務能夠訪問該訊號量保護的共享資源。初始值為1就變成相互排斥鎖 mutex 即同一時候僅僅能有乙個任務能夠訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1。若當前訊號量的值...
Semaphore初識 java訊號量
朋友在寫 活動的時候,為了控制線程,用到了semaphore類 之前也是沒有用到過,就簡單認識一下它。semaphore,是負責協調各個執行緒,以保證它們能夠正確 合理的使用公共資源。也是作業系統中用於控制程序同步互斥的量。或者說,簡單的來講,就 是訊號量。比如我們去網咖開機子上網 原諒樓主是個網癮...
訊號量Semaphore學習總結
訊號量 semaphore 有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵 段不被併發呼叫。在進入乙個關鍵 段之前,執行緒必須獲取乙個訊號量 一旦該關鍵 段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵 段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這...