Semaphore是一個計數信號量。從概念上講,信號量維護一個許可集合。如有必要,在許可可用前會阻塞每一個acquire(),然後在獲取該許可。每個release()添加一個許可,從而可能釋放一個正在阻塞的獲取者。就像排隊進入上海博物館一樣,先放幾個人進去,等這幾個走了,然後在放幾個人進去,就像是一種排隊機制。
Semaphore主要的、常用的方法有:
Semaphore(int permits),創建具有給定的許可數和給定的非公平的公平設置的Semaphore數量。
Semaphore(int permits,boolean fair),創建具有給定的許可數和給定的公平設置的Semaphore數量
所謂公平性就是是否先進來的先釋放,默認是否的
void acquire(),從此信號量獲取一個許可,在提供一個許可前一職將線程阻塞,否則線程被中斷。
void release(),釋放一個許可,將其返回給信號量。
void release(int permits),釋放給定數目的許可,將其返回到信號量
使用場景:
排隊場景,資源有限的房間,資源有限的群等等。常見的實際應用場景包括線程池、連接池等。
實例:
假設一個服務器資源有限,只允許3個人進行訪問,一共來了10個人的場景。
運行結果如下:
相關推薦
'java高併發(24):ThreadLocal,InheritableThreadLocal(通俗易懂)'
"本文內容需要解決的問題介紹ThreadLocal介紹InheritableThreadLocal需要解決的問題我們還是以解決問題的方式來引出ThreadLocal、InheritableThreadLocal,這樣印象會深刻一些。目前java開發web系統一般有3層,co...
'探索JAVA併發,如何減少鎖的競爭'
"鎖的競爭會限制代碼的可伸縮性,在併發編程時通過一些手段有意地減少鎖競爭,可以讓程序有更好的表現。所謂可伸縮性,即當增加計算資源(如CPU、內存、帶寬等)時,程序的吞吐量或處理能力會相應增加。這個時候,我們當然希望增加的效果越明顯越好,不過如果鎖競爭太嚴重,可伸縮性會大打折...
'java高併發(12)JUC:ReentrantLock重入鎖'
"synchronized的侷限性synchronized是java內置的關鍵字,它提供了一種獨佔的加鎖方式。synchronized的獲取和釋放鎖由jvm實現,用戶不需要顯示的釋放鎖,非常方便,然而synchronized也有一定的侷限性,例如:當線程嘗試獲取鎖的時候,如...
'JAVA併發異步編程接口,從複雜到簡單一步搞定'
"引言什麼?對你沒有聽錯,也沒有看錯 ..多線程併發執行任務,取結果歸集~~ 不再憂愁....先來看一些APP的獲取數據,諸如此類,一個頁面獲取N多個,多達10個左右的一個用戶行為數據,比如:點贊數,發佈文章數,點贊數,消息數,關注數,收藏數,粉絲數,卡券數,紅包數.......
'Java教程之Java數據結構的學習方法分享'
"Java數據結構是所有Java開發工程師在日常工作中不可缺少的,尤其是我們在處理數據中經常會用到數據結構,這麼重要的知識點很多初學者在學習Java數據結構時不知道該如何學習?下面千鋒武漢Java培訓小編就為大家分享Java數據結構學習方法。Java的工具包提供了非常強大的...
'多線程同步的五種方法,讓你全面瞭解線程同步'
"一、為什麼要線程同步 因為當我們有多個線程要同時訪問一個變量或對象時,如果這些線程中既有讀又有寫操作時,就會導致變量值或對象的狀態出現混亂,從而導致程序異常。舉個例子,如果一個銀行賬戶同時被兩個線程操作,一個取100塊,一個存錢100塊。假設賬戶原本有0塊,如果取錢線程和...
Java
2019-08-07
'詳解Java高併發——線程池的使用淺析'
"背景當系統併發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷燬線程需要消耗大量的系統資源。所以需要一個辦法使得線程可以複用,即當線程執行完一個任務,並不被銷燬,而是可以繼續執行其他的任務。在Ja...
Java
2019-08-07
'Java多線程之Callable和Future'
"本篇說明的是Callable和Future,它倆很有意思的,一個產生結果,一個拿到結果。 Callable接口類似於Runnable,從名字就可以看出來了,但是Runnable不會返回結果,並且無法拋出返回結果的異常,而Callable功能更強大一些,被線程執行後,可以返...
Java
2019-08-05
'Java高併發(八):線程組?WTF'
"線程組我們可以把線程歸屬到某個線程組中,線程組可以包含多個線程以及線程組,線程和線程組組成了父子關係,是個樹形結構,如下圖:使用線程組可以方便管理線程,線程組提供了一些方法方便方便我們管理線程。 #pgc-card .pgc-card-href { t...
'Java-徹底弄懂netty-非得清的同步異步阻塞非阻塞-知識鋪'
" 知識鋪: 致力於打造輕知識點,持續更新每次的知識點較少,閱讀不累。不佔太多時間,不停的來喚醒你記憶深處的知識點。一、認識NIO1.1 同步與異步同步:串行執行下去,下一步等待上一步結果。異步:不等待請求結果,直接執行下一步,上一步的結果通過回調或通知機制告知。1.2 阻...
推薦中...