線程安全6 - Semaphore:控制并發(fā)線程個(gè)數(shù)

Semaphore可以維護(hù)當(dāng)前訪問自身的線程個(gè)數(shù)贰您,并提供了同步機(jī)制怎抛。使用Semaphore可以控制同時(shí)訪問資源的線程個(gè)數(shù)蚯嫌,例如哲虾,實(shí)現(xiàn)一個(gè)文件允許的并發(fā)訪問數(shù)。

  • Semaphore實(shí)現(xiàn)的功能就類似于廁所有5個(gè)坑择示,加入有十個(gè)人要上廁所妒牙,那么同時(shí)能有多少個(gè)人上廁所呢?同時(shí)只能有5個(gè)人能夠占用对妄,當(dāng)5個(gè)人中的任何一個(gè)人讓開后湘今,其中在等待的另外5個(gè)人中又有一個(gè)可以占用了。
  • 另外等待的5個(gè)人中可以是隨機(jī)獲得優(yōu)先機(jī)會(huì)剪菱,也可以是按照先來后到的順序獲得機(jī)會(huì)摩瞎,這取決于構(gòu)造Semaphore對(duì)象時(shí)傳入的參數(shù)。
  • 單個(gè)信號(hào)量的Semaphore對(duì)象可以實(shí)現(xiàn)互斥鎖的功能孝常,并且可以是由一個(gè)線程獲得了“鎖”旗们,再由另外一個(gè)線程釋放“鎖”,這可應(yīng)用于死鎖恢復(fù)的一些場合构灸。

實(shí)例:
管理停車位上渴,一個(gè)小的電子設(shè)備,實(shí)時(shí)性強(qiáng)就要Semaphore。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestSemaphore {
    private static final int NUM = 3;

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final Semaphore sp = new Semaphore(3);
        
        for (int i = 0; i < 10; i++) {
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    try {
                        sp.acquire();//獲取坑位
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("線程 " + Thread.currentThread().getName() 
                            + "進(jìn)入稠氮,當(dāng)前已有" + (NUM-sp.availablePermits() + "個(gè)并發(fā)"));
                    
                    try {
                        Thread.sleep((long)Math.random() * 10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    System.out.println("線程 " + Thread.currentThread().getName() + "即將離開");
                    
                    sp.release();//釋放當(dāng)前線程占用的坑位
                    System.out.println("線程 " + Thread.currentThread().getName() 
                            + "已離開曹阔,當(dāng)前已有" + (NUM-sp.availablePermits() + "個(gè)并發(fā)"));
                    
                }
            }; //Runnable Def
            service.execute(run);
        } //for
        
        service.shutdown(); 
        while (!service.isTerminated()) {  
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }  
        } 
        System.out.println("結(jié)束了!");
    }
    

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隔披,一起剝皮案震驚了整個(gè)濱河市赃份,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奢米,老刑警劉巖抓韩,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鬓长,居然都是意外死亡谒拴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門涉波,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英上,“玉大人,你說我怎么就攤上這事怠蹂∩蒲樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵城侧,是天一觀的道長易遣。 經(jīng)常有香客問我,道長嫌佑,這世上最難降的妖魔是什么豆茫? 我笑而不...
    開封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮屋摇,結(jié)果婚禮上揩魂,老公的妹妹穿的比我還像新娘。我一直安慰自己炮温,他們只是感情好火脉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柒啤,像睡著了一般倦挂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上担巩,一...
    開封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天方援,我揣著相機(jī)與錄音,去河邊找鬼涛癌。 笑死犯戏,一個(gè)胖子當(dāng)著我的面吹牛送火,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播先匪,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼种吸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了胚鸯?” 一聲冷哼從身側(cè)響起骨稿,我...
    開封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤笨鸡,失蹤者是張志新(化名)和其女友劉穎姜钳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形耗,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了激涤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟糕。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倦踢,靈堂內(nèi)的尸體忽然破棺而出送滞,到底是詐尸還是另有隱情,我是刑警寧澤辱挥,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布犁嗅,位于F島的核電站,受9級(jí)特大地震影響晤碘,放射性物質(zhì)發(fā)生泄漏褂微。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一园爷、第九天 我趴在偏房一處隱蔽的房頂上張望宠蚂。 院中可真熱鬧,春花似錦童社、人聲如沸求厕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀癣。三九已至,卻和暖如春灭抑,著一層夾襖步出監(jiān)牢的瞬間十艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來泰國打工腾节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忘嫉,地道東北人荤牍。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像庆冕,于是被迫代替她去往敵國和親康吵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

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