日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
忘掉Java并發(fā),先聽完這個(gè)故事...

 最近在給別人講解 Java 并發(fā)編程面試考點(diǎn)時(shí),為了解釋鎖對(duì)象這個(gè)概念,想了一個(gè)形象的故事。

創(chuàng)新互聯(lián)建站專注于江山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供江山營(yíng)銷型網(wǎng)站建設(shè),江山網(wǎng)站制作、江山網(wǎng)頁(yè)設(shè)計(jì)、江山網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造江山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供江山網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

圖片來(lái)自 Pexels

后來(lái)慢慢發(fā)現(xiàn)這個(gè)故事似乎能講解 Java 并發(fā)編程中好多核心概念,于是完善起來(lái)形成了這篇文章。

大家先忘記并發(fā)編程,只聽我給你講個(gè)故事:

故事可能比較奇怪,有這么一個(gè)學(xué)校,里面有好多好多人,我們簡(jiǎn)單分成學(xué)生、老師、以及宿管阿姨。

學(xué)校中間還有一個(gè)很奇葩的水果超市,里面有個(gè)倉(cāng)庫(kù)放著蘋果、西瓜、橘子。來(lái)這個(gè)超市的人,一方面可以拿走水果吃掉,另一方面也可以送來(lái)水果還錢。

不過(guò)超市還有一個(gè)很奇葩的規(guī)則,就是學(xué)生只能去吃或者送蘋果,老師則只能是吃或者送西瓜,宿管阿姨只能是吃或者送橘子。

這個(gè)超市的進(jìn)出也很有規(guī)矩,來(lái)這個(gè)超市的人,必須持有相應(yīng)的證件,學(xué)生則需要持有學(xué)生證,老師需要持有教師證,宿管阿姨需要持有阿姨證。

這三個(gè)證每個(gè)都分別只有一個(gè),保管在超市門口的一個(gè)領(lǐng)證處,人們進(jìn)入這個(gè)超市之前,必須先去取證處那里領(lǐng)取相應(yīng)的證件才能進(jìn)入。

如果證件暫時(shí)被別人取走了拿不到,則需要到后方的等待區(qū)里面排隊(duì)等證。那這個(gè)等待區(qū)也有三個(gè),分別是學(xué)生證等待區(qū),教師證等待區(qū),阿姨證等待區(qū)。

進(jìn)入超市里面就更加奇葩了,不論是要從這個(gè)超市拿走水果,還是要送來(lái)水果,都需要通過(guò)一個(gè)操作臺(tái)來(lái)控制,而這個(gè)操作臺(tái),同一時(shí)刻只能有一個(gè)人進(jìn)行操作。

這個(gè)操作臺(tái)為了防止有人霸占操作臺(tái)過(guò)長(zhǎng)時(shí)間,只允許一個(gè)人持續(xù)操作 10s,10s 之后會(huì)在屏幕上顯示一個(gè) ID,只有這個(gè) ID 的人才能來(lái)操作。

至于選擇什么號(hào)碼,老師學(xué)生或是宿管阿姨都無(wú)法決定和干預(yù),只能任憑這個(gè)操作臺(tái)來(lái)決策。

但好在,每個(gè)人在操作臺(tái)上都有自己的賬號(hào),操作一半被中斷的數(shù)據(jù)并不會(huì)丟失。

這個(gè)故事的背景就介紹完了,下面這個(gè)學(xué)校就發(fā)生了各種各樣的事。

首先我們假設(shè),進(jìn)這所學(xué)校的人,都是為了去超市做事情。某一時(shí)刻,操作臺(tái)上顯示了一個(gè)號(hào)碼 2 號(hào),這個(gè)號(hào)碼通過(guò)各種學(xué)校大屏幕通知給所有的人。

于是 ID 為 2 號(hào)的學(xué)生小明看到了自己的號(hào)碼,得知自己獲得了進(jìn)入超市操作控制臺(tái)的權(quán)利,于是出發(fā)前往超市。

小明首先到超市門口,問(wèn)領(lǐng)證處的管理人員,“給我一張學(xué)生證!”。

管理人員找了找發(fā)現(xiàn)有一張學(xué)生證,于是便給了小明。小明拿到了學(xué)生證,順利進(jìn)入超市,并坐在了操作臺(tái)前,登錄了自己的賬號(hào)系統(tǒng)。

小明此行的目的是為了拿走一個(gè)蘋果,于是他點(diǎn)擊了蘋果商品的圖標(biāo),系統(tǒng)顯示蘋果還有 4 個(gè)。

于是小明順利地拿走了蘋果,系統(tǒng)將蘋果數(shù)量 -1,將新的蘋果數(shù)量 3 記錄到總系統(tǒng)庫(kù)中。

接著小明走出超市,將學(xué)生證交還給了領(lǐng)證處,走出了校園,消失在外面的人海中。

接著操作臺(tái)上顯示了3號(hào),同樣通過(guò)學(xué)校大屏幕通知給了所有人。ID 為 3 號(hào)的學(xué)生小張看到了自己的號(hào)碼,得知自己獲得了進(jìn)入超市操作控制臺(tái)的權(quán)利,于是出發(fā)前往超市。

小張和小明做著完全相同的操作,但小張操作太慢了,剛剛點(diǎn)擊完了蘋果商品的圖標(biāo),系統(tǒng)就顯示了下一個(gè)人的號(hào)碼 5 號(hào)。此時(shí)小明只能被迫終止自己的操作,讓出操作臺(tái)的權(quán)利。

ID 為 5 號(hào)的學(xué)生小王接到通知,興沖沖地前往超市,并在領(lǐng)證處問(wèn)管理人員,“給我一張學(xué)生證!”

管理人員找了找,發(fā)現(xiàn)學(xué)生證已經(jīng)被小張取走了,只能告訴小王,“抱歉,學(xué)生證暫時(shí)沒有,請(qǐng)到后面的學(xué)生證等待區(qū)排隊(duì)吧!”。小王沒辦法,只能乖乖去排隊(duì)了。

這時(shí)操作臺(tái)再次顯示了 3 號(hào),也就是剛剛操作到一半的小張。小張此時(shí)還在超市里,并不需要重新進(jìn)入,于是小張趕緊到操作臺(tái)前繼續(xù)著剛剛的操作,取走了一個(gè)蘋果,離開了超市,交還了學(xué)生證。

此時(shí)領(lǐng)證處的管理人員收到了學(xué)生證,對(duì)著后面的學(xué)生證排隊(duì)區(qū)喊,“學(xué)生證有啦,排隊(duì)的人過(guò)來(lái)取吧!”

正在排隊(duì)等證的 5 號(hào)小王聽到后,從排隊(duì)的隊(duì)列里出來(lái),準(zhǔn)備領(lǐng)證并進(jìn)入超市。但此時(shí)操作臺(tái)上顯示的號(hào)是另一個(gè)學(xué)生 10 號(hào),10 號(hào)學(xué)生拿走了學(xué)生證,進(jìn)入超市開始操作。

操作到一半,操作臺(tái)時(shí)間限制又到了,顯示了小王的 ID 5 號(hào)。小王剛從等待領(lǐng)證的隊(duì)列里出來(lái),終于獲得了進(jìn)行下一步行動(dòng)的準(zhǔn)許,于是走向了領(lǐng)證處,“給我一張學(xué)生證!”

由于學(xué)生證已經(jīng)被 10 號(hào)拿走,管理人員只能說(shuō),“抱歉,學(xué)生證暫時(shí)沒有,請(qǐng)到后面的學(xué)生證等待區(qū)排隊(duì)吧!”。

小王一看等了那么久居然又被別人搶先了一步,剛想爆粗口,想到了這個(gè)學(xué)校的名言,“這個(gè)世界是不公平的”,于是又乖乖走向了學(xué)生證等待區(qū),繼續(xù)排隊(duì)。

等 10 號(hào)操作完出來(lái)了,還了學(xué)生證,小王又被領(lǐng)證處管理員喊話,“學(xué)生證有啦,排隊(duì)的人過(guò)來(lái)取吧!”。

小王走出排隊(duì)區(qū),而此時(shí)操作臺(tái)終于顯示了小王的號(hào)碼 5 號(hào)。小王這次順利領(lǐng)取了學(xué)生證,進(jìn)入了超市,坐在了操作臺(tái)上,登錄了自己的系統(tǒng)。

小王想買蘋果,于是點(diǎn)擊了蘋果商品的按鈕,但系統(tǒng)顯示蘋果數(shù)量為 0!

小王此時(shí)想了想,有了個(gè)接下來(lái)的計(jì)劃:

  • 繼續(xù)呆在超市里,得空就去操作臺(tái)上查詢一下蘋果的數(shù)量,直到有蘋果為止。

但繼續(xù)呆在超市里,可能導(dǎo)致想向超市送蘋果的學(xué)生拿不到學(xué)生證,而自己也就永遠(yuǎn)無(wú)法得到蘋果了,顯然不妥。

  • 所以小王的另一個(gè)想法是,走出超市,交還學(xué)生證,等下次有機(jī)會(huì)再進(jìn)入超市查看蘋果數(shù)量,直到有蘋果為止。

這樣雖然有機(jī)會(huì)得到蘋果,但太累了,假如這期間根本沒人往超市送蘋果,那這一趟趟其實(shí)是白費(fèi)事的。

  • 于是小王想出了一個(gè)聰明的方案,我可以走出超市,到一個(gè)地方等待,在這里不會(huì)收到操作臺(tái)的通知。

但如果有人向超市送蘋果了,那這個(gè)等待區(qū)里會(huì)發(fā)一個(gè)信號(hào),這時(shí)超市才有可能是有蘋果的,這時(shí)我從等待區(qū)里出來(lái),等待叫號(hào)的機(jī)會(huì)。雖然蘋果有可能被其他吃蘋果的學(xué)生搶沒,但這樣起碼不會(huì)浪費(fèi)太多時(shí)間。

剛剛好超市旁邊為每一種水果準(zhǔn)備了好多等待區(qū),一共有六個(gè),分別是:蘋果沒了等待區(qū),西瓜沒了等待區(qū),橘子沒了等待區(qū)。蘋果滿了等待區(qū),西瓜滿了等待區(qū),橘子滿了等待區(qū)。

小王很聰明,去了蘋果沒了等待區(qū),等待著有人往里送蘋果的信號(hào)。這時(shí)小孫走進(jìn)了超市,給超市添置了 5 個(gè)蘋果,并換來(lái)了零花錢。

之后他立刻通知蘋果沒了等待區(qū),給了個(gè)信號(hào)“超市有蘋果啦!”,但此時(shí)小孫還沒有走出超市呢。

小王在等待區(qū)里收到信號(hào),立刻走出了等待區(qū),等待被叫號(hào),以完成自己吃蘋果的任務(wù)。

但很不幸,在小王得到叫號(hào)機(jī)會(huì)之前,蘋果又被其他幾個(gè)學(xué)生搶光了,這時(shí)才輪到小王。

小王也很聰明,他考慮到了這種情況,沒有直接取蘋果,而是重新查詢了一遍蘋果數(shù)量,發(fā)現(xiàn)蘋果數(shù)量為 0,于是重復(fù)之前的步驟,小王再次回到了蘋果沒了等待區(qū)。

接下來(lái)的時(shí)間里,小王不斷在蘋果沒了等待區(qū)和學(xué)生證等待區(qū)移動(dòng),小王發(fā)現(xiàn)為了吃一個(gè)蘋果太難了,必須同時(shí)滿足:蘋果沒了等待區(qū)發(fā)來(lái)了“超市有蘋果了”的信號(hào),領(lǐng)證區(qū)此時(shí)有學(xué)生證,并且在操作臺(tái)上查詢出的蘋果數(shù)量不為 0。

終于有一次,小王成功滿足了這三個(gè)條件,在操作臺(tái)上看到蘋果的數(shù)量為 1!小王正激動(dòng)地準(zhǔn)備按下購(gòu)買按鈕,可此時(shí)操作臺(tái)一閃,突然出現(xiàn)了別人的號(hào)碼。

這個(gè)人是超市管理員,拿著一張?zhí)厥獾某泄芾韱T證順利進(jìn)入了超市,將蘋果拿走,此時(shí)蘋果數(shù)量又變成了 0。

之后又輪到小王操作,但小王并不知道之前發(fā)生的一切,他眼中明明看到蘋果數(shù)量是 1。

小王為了保險(xiǎn)起見,又多次查詢了蘋果數(shù)量,發(fā)現(xiàn)仍然是 1,于是興奮地點(diǎn)下了購(gòu)買按鈕!

于是,操作臺(tái)對(duì)根本沒有蘋果的儲(chǔ)藏區(qū)發(fā)出了取蘋果的指令,該系統(tǒng)根本沒有想到會(huì)有這種事情發(fā)生,于是機(jī)器炸了,整個(gè)學(xué)校夷為平地。

數(shù)年后,學(xué)校慢慢被重新建立了起來(lái),之前做操作臺(tái)的人已經(jīng)被槍斃了,高薪聘請(qǐng)了一位高人來(lái)建造,解決了之前的那個(gè)問(wèn)題。

超市又順利運(yùn)轉(zhuǎn)起來(lái),有時(shí)超市只有一個(gè)人,有時(shí)超市會(huì)有三個(gè)人,分別是學(xué)生、老師、宿管阿姨,他們仨人互不影響,相安無(wú)事。學(xué)校的生活再次豐富了起來(lái)。

----------------------華麗的分割線-----------------------

這個(gè)故事包含了 Java 多線程的大部分核心問(wèn)題,下面我把故事重新講一遍。

有這么一個(gè)學(xué)校(Java 虛擬機(jī)),里面有好多好多人(線程),我們簡(jiǎn)單分成學(xué)生、老師、以及宿管阿姨。

學(xué)校中間還有一個(gè)很奇葩的水果超市(臨界區(qū)),里面有個(gè)倉(cāng)庫(kù)放著蘋果、西瓜、橘子(臨界區(qū)里的受保護(hù)資源)。

來(lái)這個(gè)超市的人,一方面可以拿走水果吃掉,另一方面也可以送來(lái)水果還錢。不過(guò)超市還有一個(gè)很奇葩的規(guī)則,就是學(xué)生只能去吃或者送蘋果,老師則只能吃或者送西瓜,宿管阿姨只能吃或者送橘子。

這個(gè)超市的進(jìn)出也很有規(guī)矩,來(lái)這個(gè)超市的人,必須持有相應(yīng)的證件(鎖對(duì)象),學(xué)生則需要持有學(xué)生證,老師需要持有教師證,宿管阿姨需要持有阿姨證(不同的鎖對(duì)象)。

這三個(gè)證每個(gè)都分別只有一個(gè),保管在超市門口的一個(gè)領(lǐng)證處(獲取鎖的地方,可以說(shuō)是堆吧),人們進(jìn)入這個(gè)超市之前,必須先去取證處那里領(lǐng)取相應(yīng)的證件(獲取鎖)才能進(jìn)入。

如果證件暫時(shí)被別人取走了拿不到(獲取鎖失敗),則需要到后方的等待區(qū)(同步隊(duì)列 SychronizedQueue)里面排隊(duì)等證。

那這個(gè)等待區(qū)也有三個(gè),分別是學(xué)生證等待區(qū),教師證等待區(qū),阿姨證等待區(qū)(每個(gè)鎖對(duì)象對(duì)應(yīng)一個(gè)同步隊(duì)列)。

進(jìn)入超市里面就更加奇葩了,不論是要從這個(gè)超市拿走水果,還是要送來(lái)水果,都需要通過(guò)一個(gè)操作臺(tái)(單核 CPU)來(lái)控制,而這個(gè)操作臺(tái),同一時(shí)刻只能有一個(gè)人進(jìn)行操作。

這個(gè)操作臺(tái)為了防止有人霸占操作臺(tái)過(guò)長(zhǎng)時(shí)間,只允許一個(gè)人持續(xù)操作 10s(CPU 時(shí)間片),10s 之后會(huì)在屏幕上顯示一個(gè) ID,只有這個(gè) ID 的人才能來(lái)操作(線程切換)。

至于選擇什么號(hào)碼,老師學(xué)生或是宿管阿姨都無(wú)法決定和干預(yù),只能任憑這個(gè)操作臺(tái)來(lái)決策(操作系統(tǒng)決定線程的切換和時(shí)間的分配)。

但好在,每個(gè)人在操作臺(tái)上都有自己的賬號(hào)(線程的工作內(nèi)存),操作一半被中斷的數(shù)據(jù)并不會(huì)丟失。

這個(gè)故事的背景就介紹完了,下面這個(gè)學(xué)校就發(fā)生了各種各樣的事。

首先我們假設(shè),進(jìn)這所學(xué)校的人,都是為了去超市做事情。首先人出現(xiàn)在學(xué)校外(線程狀態(tài) NEW),人進(jìn)入學(xué)校(線程狀態(tài) RUNNABLE)。

某一時(shí)刻,操作臺(tái)上顯示了一個(gè)號(hào)碼 2 號(hào),這個(gè)號(hào)碼通過(guò)各種學(xué)校大屏幕通知給所有的人。

于是 ID 為 2 號(hào)的學(xué)生小明看到了自己的號(hào)碼,得知自己獲得了進(jìn)入超市操作控制臺(tái)的權(quán)利(獲得 CPU 執(zhí)行權(quán)),于是出發(fā)前往超市。

小明首先到超市門口,問(wèn)領(lǐng)證處的管理人員,“給我一張學(xué)生證!”(獲取鎖)。管理人員找了找發(fā)現(xiàn)有一張學(xué)生證,于是便給了小明。

小明拿到了學(xué)生證,順利進(jìn)入超市(獲取鎖成功,進(jìn)入臨界區(qū)),并坐上了操作臺(tái)前,登錄了自己的賬號(hào)系統(tǒng)(準(zhǔn)備好工作內(nèi)存,開始執(zhí)行臨界區(qū)代碼)。

小明此行的目的是為了拿走一個(gè)蘋果,于是他點(diǎn)擊了蘋果商品的圖標(biāo),系統(tǒng)顯示蘋果還有 4 個(gè)。

于是小明順利地拿走了蘋果,系統(tǒng)將蘋果數(shù)量 -1,將新的蘋果數(shù)量 3 記錄到總系統(tǒng)庫(kù)中(代碼)。

接著小明走出超市(代碼執(zhí)行完畢出臨界區(qū)),將學(xué)生證交還給了領(lǐng)證處(釋放鎖),走出了校園(線程狀態(tài) TERMINAL),消失在外面的人海中。

接著操作臺(tái)上顯示了 3 號(hào),同樣通過(guò)學(xué)校大屏幕通知給了所有人。ID 為 3 號(hào)的學(xué)生小張看到了自己的號(hào)碼,得知自己獲得了進(jìn)入超市操作控制臺(tái)的權(quán)利,于是出發(fā)前往超市。

小張和小明做著完全相同的操作,但小張操作太慢了,剛剛點(diǎn)擊完了蘋果商品的圖標(biāo),系統(tǒng)就顯示了下一個(gè)人的號(hào)碼 5 號(hào)。此時(shí)小張只能被迫終止自己的操作,讓出操作臺(tái)的權(quán)利(線程切換)。

ID 為 5 號(hào)的學(xué)生小王接到通知,興沖沖地前往超市,并在領(lǐng)證處問(wèn)管理人員,“給我一張學(xué)生證!”。

管理人員找了找,發(fā)現(xiàn)學(xué)生證已經(jīng)被小明取走了,只能告訴小王,“抱歉,學(xué)生證暫時(shí)沒有,請(qǐng)到后面的學(xué)生證等待區(qū)(同步隊(duì)列 WaitQueue)排隊(duì)吧!”(獲取鎖失敗)。

小王沒辦法,只能乖乖去排隊(duì)了(線程狀態(tài) BLOCKING)。這時(shí)操作臺(tái)再次顯示了 3 號(hào),也就是剛剛操作到一半的小張。

小張此時(shí)還在超市里(不釋放鎖),并不需要重新進(jìn)入,于是他趕緊到操作臺(tái)前繼續(xù)著剛剛的操作(線程切換,繼續(xù)執(zhí)行中斷的代碼),取走了一個(gè)蘋果,離開了超市,交還了學(xué)生證(釋放鎖)。

此時(shí)領(lǐng)證處的管理人員收到了學(xué)生證,對(duì)著后面的學(xué)生證排隊(duì)區(qū)喊,“學(xué)生證有啦,排隊(duì)的人過(guò)來(lái)取吧!”(通知同步隊(duì)列出隊(duì))。

正在排隊(duì)等證的 5 號(hào)小王聽到后,從排隊(duì)的隊(duì)列里出來(lái),準(zhǔn)備領(lǐng)證并進(jìn)入超市。但此時(shí)操作臺(tái)上顯示的號(hào)是另一個(gè)學(xué)生 10 號(hào),10 號(hào)學(xué)生拿走了學(xué)生證,進(jìn)入超市開始操作。

操作到一半,操作臺(tái)時(shí)間限制又到了,顯示了小王的 ID 5 號(hào)。小王剛從等待領(lǐng)證的隊(duì)列里出來(lái),終于獲得了進(jìn)行下一步行動(dòng)的準(zhǔn)許,于是走向了領(lǐng)證處,“給我一張學(xué)生證!”。

由于學(xué)生證已經(jīng)被 10 號(hào)拿走,管理人員只能說(shuō),“抱歉,學(xué)生證暫時(shí)沒有,請(qǐng)到后面的學(xué)生證等待區(qū)排隊(duì)吧!”

小王一看等了那么久居然又被別人搶先了一步,剛想爆粗口,想到了這個(gè)學(xué)校的名言,“這個(gè)世界是不公平的”,于是又乖乖走向了學(xué)生證等待區(qū),繼續(xù)排隊(duì)。(非公平鎖,并不是誰(shuí)等的時(shí)間最長(zhǎng)誰(shuí)就獲取鎖)

等 10 號(hào)操作完出來(lái)了,還了學(xué)生證,小王又被領(lǐng)證處管理員喊話,“學(xué)生證有啦,排隊(duì)的人過(guò)來(lái)取吧!”。

小王走出排隊(duì)區(qū),而此時(shí)操作臺(tái)終于顯示了小王的號(hào)碼 5 號(hào)。小王這次順利領(lǐng)取了學(xué)生證,進(jìn)入了超市,坐在了操作臺(tái)上,登錄了自己的系統(tǒng)。

小王想買蘋果,于是點(diǎn)擊了蘋果商品的按鈕,但系統(tǒng)顯示蘋果數(shù)量為 0!

小王此時(shí)想了想,有了個(gè)接下來(lái)的計(jì)劃:

  • 繼續(xù)呆在超市里,得空就去操作臺(tái)上查詢一下蘋果的數(shù)量,直到有蘋果為止。

但繼續(xù)呆在超市里,可能導(dǎo)致想向超市送蘋果的學(xué)生拿不到學(xué)生證,而自己也就永遠(yuǎn)無(wú)法得到蘋果了,顯然不妥。(Sychronized 代碼塊里循環(huán)等待)

  • 所以小王的另一個(gè)想法是,走出超市,交還學(xué)生證,等下次有機(jī)會(huì)再進(jìn)入超市查看蘋果數(shù)量,直到有蘋果為止。

這樣雖然有機(jī)會(huì)得到蘋果,但太累了,假如這期間根本沒人往超市送蘋果,那這一趟趟其實(shí)是白費(fèi)事的。(Sychronized 代碼塊外循環(huán)等待)

  • 于是小王想出了一個(gè)聰明的方案,我可以走出超市,到一個(gè)地方等待(Wait),在這里不會(huì)收到操作臺(tái)的通知。

如果有人向超市送蘋果了,那這個(gè)等待區(qū)里會(huì)發(fā)一個(gè)信號(hào)(Notify),這時(shí)超市才有可能是有蘋果的,這時(shí)我從等待區(qū)里出來(lái),等待叫號(hào)的機(jī)會(huì)。

雖然蘋果有可能被其他吃蘋果的學(xué)生搶沒,但這樣起碼不會(huì)浪費(fèi)太多時(shí)間。(等待通知機(jī)制)

剛剛好超市旁邊為每一種水果準(zhǔn)備了好多等待區(qū)(等待隊(duì)列 WaitQueue),一共有六個(gè),分別是:蘋果沒了等待區(qū),西瓜沒了等待區(qū),橘子沒了等待區(qū),蘋果滿了等待區(qū),西瓜滿了等待區(qū),橘子滿了等待區(qū)(條件變量 Condition)。

小王很聰明,走出超市交還學(xué)生證(Wait 會(huì)釋放鎖),去了蘋果沒了等待區(qū)(Wait),等待著有人往里送蘋果的信號(hào)(同步信號(hào)-喚醒)。

這時(shí)小孫走進(jìn)了超市,給超市添置了 5 個(gè)蘋果,并換來(lái)了零花錢。之后他立刻通知蘋果沒了等待區(qū),給了個(gè)信號(hào)“超市有蘋果啦!(AppleNotEmpty.notifyAll)”,但此時(shí)小孫還沒有走出超市呢(Notify 不釋放鎖)。

小王在等待區(qū)里收到信號(hào),立刻走出了等待區(qū),等待被叫號(hào),以完成自己吃蘋果的任務(wù)。

但很不幸,在小王得到叫號(hào)機(jī)會(huì)之前,蘋果又被其他幾個(gè)學(xué)生搶光了,這時(shí)才輪到小王。

小王也很聰明,他考慮到了這種情況,沒有直接取蘋果,而是重新查詢了一遍蘋果數(shù)量(Wait 一般配合 While 條件),發(fā)現(xiàn)蘋果數(shù)量為 0,于是重復(fù)之前的步驟,小王再次回到了蘋果沒了等待區(qū)。

接下來(lái)的時(shí)間里,小王不斷在蘋果沒了等待區(qū)和學(xué)生證等待區(qū)移動(dòng),小王發(fā)現(xiàn)為了吃一個(gè)蘋果太難了,必須同時(shí)滿足,蘋果沒了等待區(qū)發(fā)來(lái)了“超市有蘋果了”的信號(hào),領(lǐng)證區(qū)此時(shí)有學(xué)生證,并且在操作臺(tái)上查詢出的蘋果數(shù)量不為 0。

終于有一次。小王成功滿足了這三個(gè)條件,在操作臺(tái)上看到蘋果的數(shù)量為 1!小王正激動(dòng)地準(zhǔn)備按下購(gòu)買按鈕,可此時(shí)操作臺(tái)一閃,突然出現(xiàn)了別人的號(hào)碼。

這個(gè)人是超市管理員,拿著一張?zhí)厥獾某泄芾韱T證順利進(jìn)入了超市,將蘋果拿走,此時(shí)蘋果數(shù)量又變成了 0。

之后又輪到小王操作,但小王并不知道之前發(fā)生的一切,他眼中明明看到蘋果數(shù)量是 1。

小王為了保險(xiǎn)起見,又多次查詢了蘋果數(shù)量,發(fā)現(xiàn)仍然是 1(非 Volatile 修飾的變量不保證線程之間的可見性),于是興奮地點(diǎn)下了購(gòu)買按鈕!

于是,操作臺(tái)對(duì)根本沒有蘋果的儲(chǔ)藏區(qū)發(fā)出了取蘋果的指令,該系統(tǒng)根本沒有想到會(huì)有這種事情發(fā)生,于是機(jī)器炸了,小王犧牲(拋出運(yùn)行時(shí)異常,線程釋放鎖并終止)。

數(shù)年后,之前做操作臺(tái)的人已經(jīng)被槍斃了,學(xué)校又高薪聘請(qǐng)了一位高人來(lái)建造,解決了之前的那個(gè)問(wèn)題(Volatile)。

超市又順利運(yùn)轉(zhuǎn)起來(lái),有時(shí)超市只有一個(gè)人(不同線程進(jìn)入鎖對(duì)象相同的臨界區(qū)會(huì)互斥,只有一個(gè)線程可以進(jìn)入),有時(shí)超市會(huì)有三個(gè)人(不同鎖對(duì)象的臨界區(qū)不互斥),分別是學(xué)生、老師、宿管阿姨,他們仨人互不影響,相安無(wú)事。學(xué)校的生活再次豐富了起來(lái)。

故事講完了,雖然不能解釋全部并發(fā)編程的內(nèi)容,也不能處處都很恰當(dāng)?shù)卣f(shuō)明細(xì)節(jié),但卻是一個(gè)很有趣的思考過(guò)程。

希望大家也能積極討論下故事中的錯(cuò)誤和不完善的地方,一起將故事講的更好。

下面整理一下故事中出現(xiàn)的東西和寓意:


當(dāng)前名稱:忘掉Java并發(fā),先聽完這個(gè)故事...
當(dāng)前鏈接:http://m.5511xx.com/article/dpjcpch.html