首先看一下里面線程間的通信問題:
一個(gè)線程向數(shù)據(jù)存儲(chǔ)空間添加數(shù)據(jù)(生產(chǎn)者),另一個(gè)線程從數(shù)據(jù)存儲(chǔ)空間去出數(shù)據(jù)(消費(fèi)者)。
這個(gè)程序中有兩個(gè)可能出現(xiàn)的問題需要考慮:
1、 假設(shè)生產(chǎn)者線程剛向數(shù)據(jù)存儲(chǔ)空間添加了一個(gè)食品的名字,還沒有加入這個(gè)食品的屬性,CPU就切換到了消費(fèi)者線程,消費(fèi)者線程將把這個(gè)食品的名字和這個(gè)人的屬性聯(lián)系在一起。
2、 消費(fèi)者拿東西都希望自己拿到的是最新的,即生產(chǎn)者剛生產(chǎn)出,消費(fèi)者就拿走,而不是拿一些陳舊的。可能出現(xiàn)消費(fèi)者拿不了最新的在程序中的原因,生產(chǎn)者放了若干次的數(shù)據(jù),消費(fèi)者才開始取數(shù)據(jù),或者是,消費(fèi)者取完一個(gè)數(shù)據(jù)后,還沒等到生產(chǎn)者放入新的數(shù)據(jù),即消費(fèi)者比生產(chǎn)者快時(shí),又重復(fù)取出這個(gè)數(shù)據(jù)
下面我們看一下具體的代碼,來體驗(yàn)一下生產(chǎn)者與消費(fèi)者的關(guān)系,平我們?nèi)コ喳湲?dāng)勞時(shí),總會(huì)要點(diǎn)吃的喝的,比如我們吃個(gè)漢堡喝個(gè)咖啡,而且這些都要是最新的,都是他們現(xiàn)做的。






















































運(yùn)行結(jié)果如下:
可以看出這里出現(xiàn)了漢堡是喝的,咖啡是吃的的情況,也就是上面我們說的第一種情況,這個(gè)可以通過synchronized實(shí)現(xiàn)同步來解決,因?yàn)橘Y源共享需要同步。

















































































第一個(gè)問題已經(jīng)解決啦,但第二個(gè)問題還是存在,這個(gè)問題我們可以用線程的等待喚醒機(jī)制即wait(),notify()方法來解決
Wait()告訴當(dāng)前線程放棄監(jiān)視器并進(jìn)入睡眠狀態(tài),直到其他線程進(jìn)入同一監(jiān)視器并調(diào)用notify()為止
Notify()喚醒同一對(duì)象監(jiān)視器中調(diào)用wait()的第一線程
































































































現(xiàn)在我們開始說的兩個(gè)問題已經(jīng)解決啦!!