Java并發(fā)案例02---生產(chǎn)者消費(fèi)者問題


package example;

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;

public class MyContainer3<T> {
    
    final private LinkedList<T>  lists = new LinkedList<T>();
    final private int MAX = 10; //最多10個(gè)元素
    private int count = 0;
    
    public synchronized void put(T t){
        while(lists.size()==MAX){
            try {
                this.wait(); //wait 99%和while結(jié)合使用帘营,而不是和if結(jié)合使用
                //容器滿了票渠,在這里wait,被叫醒時(shí)芬迄,直接是往下執(zhí)行的问顷,還沒運(yùn)行到往里扔的適合,另外一個(gè)線程往里扔了禀梳,導(dǎo)致出錯(cuò)杜窄。
                //如果用while時(shí),他會(huì)繼續(xù)再檢查一遍算途,醒了的時(shí)候塞耕,再檢查一遍。 notifyAll可以叫醒多個(gè)線程郊艘。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        lists.add(t);
        count++;
        this.notifyAll();
    }
    
    
    public synchronized  T get(){
        while(lists.size()==0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        T t = lists.removeFirst();
        count--;
        /**注意喚醒*/
        this.notifyAll();
        return t;
    }
    
    
    public static void main(String[] args) {
        
        MyContainer3<String> c = new MyContainer3<>();
        
        //啟動(dòng)消費(fèi)者線程
        for(int i=0; i<10; i++) {
            new Thread(()->{
                for(int j=0; j<5; j++) System.out.println(Thread.currentThread().getName() +"--"+c.get());
            }, "c" + i).start();
        }
        
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        //啟動(dòng)生產(chǎn)者線程
        for(int i=0; i<2; i++) {
            new Thread(()->{
                for(int j=0; j<25; j++) c.put(Thread.currentThread().getName() + " " + j);
            }, "p" + i).start();
        }
    }
    
}

面試點(diǎn):關(guān)于為什么用while 而不用if

wait 99%和while結(jié)合使用荷科,而不是和if結(jié)合使用

容器滿了,然后空了一個(gè)纱注,此時(shí)有兩個(gè)線程都醒了,他們都要爭(zhēng)取到那一把鎖畏浆,結(jié)果t2把那把鎖搶到了,然后它向容器里放了容器狞贱,此時(shí)當(dāng)t1再次被獲得鎖時(shí)刻获,它就不會(huì)檢查容器的容量,而繼續(xù)向下執(zhí)行瞎嬉,導(dǎo)致出錯(cuò)蝎毡,如果用while的話厚柳,它會(huì)回到上面再檢查一次,然后睡眠沐兵。


面試點(diǎn):為什么用notifyAll 而不用notify?

因?yàn)槿绻a(chǎn)者生產(chǎn)滿了容器后别垮,它notify的另外一個(gè)線程也是生產(chǎn)者,結(jié)果他去運(yùn)行的時(shí)候扎谎。也直接wait了碳想,這個(gè)時(shí)候,程序就死了毁靶,因?yàn)樗械木€程都睡了胧奔。

effective java 永遠(yuǎn)不要去使用notify而使用notifyAll

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市预吆,隨后出現(xiàn)的幾起案子龙填,更是在濱河造成了極大的恐慌,老刑警劉巖拐叉,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岩遗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巷嚣,警方通過查閱死者的電腦和手機(jī)喘先,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廷粒,“玉大人窘拯,你說我怎么就攤上這事“泳ィ” “怎么了涤姊?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嗤放。 經(jīng)常有香客問我思喊,道長(zhǎng),這世上最難降的妖魔是什么次酌? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任恨课,我火速辦了婚禮,結(jié)果婚禮上岳服,老公的妹妹穿的比我還像新娘剂公。我一直安慰自己,他們只是感情好吊宋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布纲辽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拖吼。 梳的紋絲不亂的頭發(fā)上鳞上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音吊档,去河邊找鬼篙议。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怠硼,可吹牛的內(nèi)容都是我干的涡上。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拒名,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了芋酌?” 一聲冷哼從身側(cè)響起增显,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脐帝,沒想到半個(gè)月后同云,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堵腹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年炸站,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚顷。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旱易,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腿堤,到底是詐尸還是另有隱情阀坏,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布笆檀,位于F島的核電站忌堂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酗洒。R本人自食惡果不足惜士修,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望樱衷。 院中可真熱鬧棋嘲,春花似錦、人聲如沸箫老。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阔籽,卻和暖如春流妻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笆制。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工绅这, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人在辆。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓证薇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親匆篓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浑度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司鸦概,掛了不少箩张,但最終還是拿到小米、百度窗市、阿里先慷、京東、新浪咨察、CVTE论熙、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,246評(píng)論 11 349
  • 相關(guān)概念 面向?qū)ο蟮娜齻€(gè)特征 封裝,繼承,多態(tài).這個(gè)應(yīng)該是人人皆知.有時(shí)候也會(huì)加上抽象. 多態(tài)的好處 允許不同類對(duì)...
    東經(jīng)315度閱讀 1,942評(píng)論 0 8
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 5,820評(píng)論 1 19
  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 879評(píng)論 0 1
  • 畢業(yè)2年了,一直在小公司上班摄狱,學(xué)得東西很雜脓诡,做過很多不同部門的工作,經(jīng)過了企業(yè)由剛創(chuàng)立到輝煌再到走下坡路的階段媒役。兩...
    怪熱慢友閱讀 13,923評(píng)論 2 4