同步工具類之Semaphore

一,計數(shù)信號量(Counting Semaphore)概述
  • 計數(shù)信號量(Counting Semaphore)用來控制同時訪問某個特定資源的操作數(shù)量,或者同時執(zhí)行某個指定操作的數(shù)量.計數(shù)信號量還可以用來實現(xiàn)某種資源池,或者對容器施加邊界
  • Semaphore中管理著一組虛擬的許可(Permit),許可的初始數(shù)量可通過構(gòu)造函數(shù)來指定.在執(zhí)行操作時可以首先獲得許可(只要還有剩余的許可),并在使用以后釋放許可.如果沒有許可,那么acquire將阻塞直到有許可(或者直到被中斷或者操作超時).release方法將返回一個許可信號量.
  • 計數(shù)信號量的一種簡化形式是二值信號量,即初始值為1的Semaphore,二值信號量可以用做互斥體(mutex),并具備不可重入的加鎖語義:誰擁有這個唯一許可,誰就擁有了互斥鎖
  • 可以使用Semaphore將任何一種容器編程有界阻塞容器
二,利用Semaphore實現(xiàn)一個有界阻塞容器示例

信號量的計數(shù)值會初始化為容器容量的最大值.add操作在向底層容器中添加一個元素之前,首先要獲取一個許可.如果add操作沒有添加任何元素,那么會立刻釋放許可.同樣,remove操作釋放一個許可,使更多的元素能夠添加到容器中.

class BoundedHashSet<T> {
    private final Set<T> set;
    private final Semaphore sem;

    public BoundedHashSet(int bound) {
        this.set = Collections.synchronizedSet(new HashSet<T>());
        sem = new Semaphore(bound);
    }

    public boolean add(T o) throws InterruptedException {
        sem.acquire();
        boolean wasAdded = false;
        try {
            wasAdded = set.add(o);
            return wasAdded;
        } finally {
            if (!wasAdded) {
                sem.release();
            }
        }
    }

    public boolean remove(Object o) {
        boolean wasRemoved = set.remove(o);
        if (wasRemoved) {
            sem.release();
        }
        return wasRemoved;
    }
}

參考:
<<java編發(fā)編程實戰(zhàn)>>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闪盔,一起剝皮案震驚了整個濱河市弯院,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泪掀,老刑警劉巖听绳,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異异赫,居然都是意外死亡椅挣,警方通過查閱死者的電腦和手機头岔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼠证,“玉大人峡竣,你說我怎么就攤上這事×烤牛” “怎么了适掰?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娩鹉。 經(jīng)常有香客問我攻谁,道長晦鞋,這世上最難降的妖魔是什么为居? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮炭晒,結(jié)果婚禮上锈嫩,老公的妹妹穿的比我還像新娘受楼。我一直安慰自己,他們只是感情好呼寸,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布艳汽。 她就那樣靜靜地躺著,像睡著了一般对雪。 火紅的嫁衣襯著肌膚如雪河狐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天瑟捣,我揣著相機與錄音馋艺,去河邊找鬼。 笑死迈套,一個胖子當著我的面吹牛捐祠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桑李,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼踱蛀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贵白?” 一聲冷哼從身側(cè)響起率拒,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禁荒,沒想到半個月后俏橘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡圈浇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年寥掐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷蜀。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡召耘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐隆,到底是詐尸還是另有隱情污它,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布庶弃,位于F島的核電站衫贬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏歇攻。R本人自食惡果不足惜固惯,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缴守。 院中可真熱鬧葬毫,春花似錦、人聲如沸屡穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村砂。三九已至烂斋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間础废,已是汗流浹背汛骂。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留色迂,地道東北人香缺。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像歇僧,于是被迫代替她去往敵國和親图张。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容