您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何解析Semaphore信號量 ,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
前幾天群里有網友問我信號量和線程池,我對信號量回答有些錯誤,后面群里其他網友做了更正,今天由于時間緊張,我就簡單的在說一下信號量和線程池。
自從 jdk5.0 開始在 java.util.concurrent 包里提供了 Semaphore 的官方實現,因此大家不需要自己去實現 Semaphore。但是還是很有必要去熟悉如何使用 Semaphore 及其背后的原理。Semaphore(信號量)是一個線程同步結構,用于在線程間傳遞信號,以避免出現信號丟失,或者像鎖一樣用于保護一個關鍵區域。
信號量和線程池的使用場景非常的廣泛,最簡單的就是 Hystirx 中提供了兩種模式執行邏輯:信號量、線程池。所以對于 JUC 這套視頻,大家還是很有必要看一看的。
Semaphore 可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。比如在 Windows 下可以設置共享文件的最大客戶端訪問個數。
Semaphore 實現的功能就類似廁所有 5 個坑,假如有10個人要上廁所,那么同時只能有多少個人去上廁所呢?同時只能有5個人能夠占用,當 5 個人中的任何一個人讓開后,其中等待的另外5個人中又有一個人可以占用了。另外等待的5個人中可以是隨機獲得優先機會,也可以是按照先來后到的順序獲得機會,這取決于構造 Semaphore 對象時傳入的參數選項。單個信號量的 Semaphore 對象可以實現互斥鎖的功能,并且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用于死鎖恢復的一些場合。
Semaphore 維護了當前訪問的個數,提供同步機制,控制同時訪問的個數。在數據結構中鏈表可以保存“無限”的節點,用 Semaphore 可以實現有限大小的鏈表。另外重入鎖 ReentrantLock 也可以實現該功能,但實現上要復雜些。
acquire()這里我定義了 10 個人要上廁所,但是只有 5 個坑位,每個人消耗隨機的時間,直接運行上面這段代碼,可以看到一開始進去了 5 個人,后來就是陸陸續續的有人進,有人出了。但是正在使用的一定不會超過 5 個的。
如果沒有可用的許可,則在發生以下兩種情況之一前,禁止將當前線程用于線程安排目的并使其處于休眠狀態:某些其他線程調用此信號量的 release()方法,并且當前線程是下一個要被分配許可的線程;或者其他某些線程中斷當前線程。從此信號量獲取一個許可,在提供一個許可前一直將線程阻塞,否則線程被中斷。獲取一個許可(如果提供了一個)并立即返回,將可用的許可數減 1。
如果當前線程:被此方法將其已中斷狀態設置為 on ;或者在等待許可時被中斷。則拋出 InterruptedException,并且清除當前線程的已中斷狀態。
釋放一個許可,將其返回給信號量。釋放一個許可,將可用的許可數增加 1。如果任意線程試圖獲取許可,則選中一個線程并將剛剛釋放的許可給予它。然后針對線程安排目的啟用(或再啟用)該線程。
不要求釋放許可的線程必須通過調用 acquire() 來獲取許可。通過應用程序中的編程約定來建立信號量的正確用法。
另外兩個不常用的方法,public int availablePermits()查看現在可用的信號量。public int drainPermits(),這個方法返回即可所有的許可數目,并將許可置 0。public Semaphore(int permits) 其中參數permits就是允許同時運行的線程數目。
關于如何解析Semaphore信號量 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。