日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

忘掉 Java 并发,先听完这个故事。。。

發布時間:2025/3/21 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 忘掉 Java 并发,先听完这个故事。。。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在給別人講解 Java 并發編程面試考點時,為了解釋鎖對象這個概念,想了一個形象的故事。

后來慢慢發現這個故事似乎能講解 Java 并發編程中好多核心概念,于是完善起來形成了這篇文章。

大家先忘記并發編程,只聽我給你講個故事:

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

學校中間還有一個很奇葩的水果超市,里面有個倉庫放著蘋果、西瓜、橘子。來這個超市的人,一方面可以拿走水果吃掉,另一方面也可以送來水果還錢。

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

這個超市的進出也很有規矩,來這個超市的人,必須持有相應的證件,學生則需要持有學生證,老師需要持有教師證,宿管阿姨需要持有阿姨證。

這三個證每個都分別只有一個,保管在超市門口的一個領證處,人們進入這個超市之前,必須先去取證處那里領取相應的證件才能進入。

如果證件暫時被別人取走了拿不到,則需要到后方的等待區里面排隊等證。那這個等待區也有三個,分別是學生證等待區,教師證等待區,阿姨證等待區。

進入超市里面就更加奇葩了,不論是要從這個超市拿走水果,還是要送來水果,都需要通過一個操作臺來控制,而這個操作臺,同一時刻只能有一個人進行操作。

這個操作臺為了防止有人霸占操作臺過長時間,只允許一個人持續操作 10s,10s 之后會在屏幕上顯示一個 ID,只有這個 ID 的人才能來操作。

至于選擇什么號碼,老師學生或是宿管阿姨都無法決定和干預,只能任憑這個操作臺來決策。

但好在,每個人在操作臺上都有自己的賬號,操作一半被中斷的數據并不會丟失。

這個故事的背景就介紹完了,下面這個學校就發生了各種各樣的事。

首先我們假設,進這所學校的人,都是為了去超市做事情。某一時刻,操作臺上顯示了一個號碼 2 號,這個號碼通過各種學校大屏幕通知給所有的人。

于是 ID 為 2 號的學生小明看到了自己的號碼,得知自己獲得了進入超市操作控制臺的權利,于是出發前往超市。

小明首先到超市門口,問領證處的管理人員,“給我一張學生證!”。

管理人員找了找發現有一張學生證,于是便給了小明。小明拿到了學生證,順利進入超市,并坐在了操作臺前,登錄了自己的賬號系統。

小明此行的目的是為了拿走一個蘋果,于是他點擊了蘋果商品的圖標,系統顯示蘋果還有 4 個。

于是小明順利地拿走了蘋果,系統將蘋果數量 -1,將新的蘋果數量 3 記錄到總系統庫中。

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

接著操作臺上顯示了3號,同樣通過學校大屏幕通知給了所有人。ID 為 3 號的學生小張看到了自己的號碼,得知自己獲得了進入超市操作控制臺的權利,于是出發前往超市。

小張和小明做著完全相同的操作,但小張操作太慢了,剛剛點擊完了蘋果商品的圖標,系統就顯示了下一個人的號碼 5 號。此時小明只能被迫終止自己的操作,讓出操作臺的權利。

ID 為 5 號的學生小王接到通知,興沖沖地前往超市,并在領證處問管理人員,“給我一張學生證!”

管理人員找了找,發現學生證已經被小張取走了,只能告訴小王,“抱歉,學生證暫時沒有,請到后面的學生證等待區排隊吧!”。小王沒辦法,只能乖乖去排隊了。

這時操作臺再次顯示了 3 號,也就是剛剛操作到一半的小張。小張此時還在超市里,并不需要重新進入,于是小張趕緊到操作臺前繼續著剛剛的操作,取走了一個蘋果,離開了超市,交還了學生證。

此時領證處的管理人員收到了學生證,對著后面的學生證排隊區喊,“學生證有啦,排隊的人過來取吧!”

正在排隊等證的 5 號小王聽到后,從排隊的隊列里出來,準備領證并進入超市。但此時操作臺上顯示的號是另一個學生 10 號,10 號學生拿走了學生證,進入超市開始操作。

操作到一半,操作臺時間限制又到了,顯示了小王的 ID 5 號。小王剛從等待領證的隊列里出來,終于獲得了進行下一步行動的準許,于是走向了領證處,“給我一張學生證!”

由于學生證已經被 10 號拿走,管理人員只能說,“抱歉,學生證暫時沒有,請到后面的學生證等待區排隊吧!”。

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

等 10 號操作完出來了,還了學生證,小王又被領證處管理員喊話,“學生證有啦,排隊的人過來取吧!”。

小王走出排隊區,而此時操作臺終于顯示了小王的號碼 5 號。小王這次順利領取了學生證,進入了超市,坐在了操作臺上,登錄了自己的系統。

小王想買蘋果,于是點擊了蘋果商品的按鈕,但系統顯示蘋果數量為 0!

小王此時想了想,有了個接下來的計劃:

  • 繼續呆在超市里,得空就去操作臺上查詢一下蘋果的數量,直到有蘋果為止。但繼續呆在超市里,可能導致想向超市送蘋果的學生拿不到學生證,而自己也就永遠無法得到蘋果了,顯然不妥。

  • 所以小王的另一個想法是,走出超市,交還學生證,等下次有機會再進入超市查看蘋果數量,直到有蘋果為止。這樣雖然有機會得到蘋果,但太累了,假如這期間根本沒人往超市送蘋果,那這一趟趟其實是白費事的。

  • 于是小王想出了一個聰明的方案,我可以走出超市,到一個地方等待,在這里不會收到操作臺的通知。但如果有人向超市送蘋果了,那這個等待區里會發一個信號,這時超市才有可能是有蘋果的,這時我從等待區里出來,等待叫號的機會。雖然蘋果有可能被其他吃蘋果的學生搶沒,但這樣起碼不會浪費太多時間。

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

小王很聰明,去了蘋果沒了等待區,等待著有人往里送蘋果的信號。這時小孫走進了超市,給超市添置了 5 個蘋果,并換來了零花錢。

之后他立刻通知蘋果沒了等待區,給了個信號“超市有蘋果啦!”,但此時小孫還沒有走出超市呢。

小王在等待區里收到信號,立刻走出了等待區,等待被叫號,以完成自己吃蘋果的任務。

但很不幸,在小王得到叫號機會之前,蘋果又被其他幾個學生搶光了,這時才輪到小王。

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

接下來的時間里,小王不斷在蘋果沒了等待區和學生證等待區移動,小王發現為了吃一個蘋果太難了,必須同時滿足:蘋果沒了等待區發來了“超市有蘋果了”的信號,領證區此時有學生證,并且在操作臺上查詢出的蘋果數量不為 0。

終于有一次,小王成功滿足了這三個條件,在操作臺上看到蘋果的數量為 1!小王正激動地準備按下購買按鈕,可此時操作臺一閃,突然出現了別人的號碼。

這個人是超市管理員,拿著一張特殊的超市管理員證順利進入了超市,將蘋果拿走,此時蘋果數量又變成了 0。

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

小王為了保險起見,又多次查詢了蘋果數量,發現仍然是 1,于是興奮地點下了購買按鈕!

于是,操作臺對根本沒有蘋果的儲藏區發出了取蘋果的指令,該系統根本沒有想到會有這種事情發生,于是機器炸了,整個學校夷為平地。

數年后,學校慢慢被重新建立了起來,之前做操作臺的人已經被槍斃了,高薪聘請了一位高人來建造,解決了之前的那個問題。

超市又順利運轉起來,有時超市只有一個人,有時超市會有三個人,分別是學生、老師、宿管阿姨,他們仨人互不影響,相安無事。學校的生活再次豐富了起來。

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

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

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

學校中間還有一個很奇葩的水果超市(臨界區),里面有個倉庫放著蘋果、西瓜、橘子(臨界區里的受保護資源)

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

這個超市的進出也很有規矩,來這個超市的人,必須持有相應的證件(鎖對象),學生則需要持有學生證,老師需要持有教師證,宿管阿姨需要持有阿姨證(不同的鎖對象)

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

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

那這個等待區也有三個,分別是學生證等待區,教師證等待區,阿姨證等待區(每個鎖對象對應一個同步隊列)

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

這個操作臺為了防止有人霸占操作臺過長時間,只允許一個人持續操作 10s(CPU 時間片),10s 之后會在屏幕上顯示一個 ID,只有這個 ID 的人才能來操作(線程切換)

至于選擇什么號碼,老師學生或是宿管阿姨都無法決定和干預,只能任憑這個操作臺來決策(操作系統決定線程的切換和時間的分配)

但好在,每個人在操作臺上都有自己的賬號(線程的工作內存),操作一半被中斷的數據并不會丟失。

這個故事的背景就介紹完了,下面這個學校就發生了各種各樣的事。

首先我們假設,進這所學校的人,都是為了去超市做事情。首先人出現在學校外(線程狀態 NEW),人進入學校(線程狀態 RUNNABLE)

某一時刻,操作臺上顯示了一個號碼 2 號,這個號碼通過各種學校大屏幕通知給所有的人。

于是 ID 為 2 號的學生小明看到了自己的號碼,得知自己獲得了進入超市操作控制臺的權利(獲得 CPU 執行權),于是出發前往超市。

小明首先到超市門口,問領證處的管理人員,“給我一張學生證!”(獲取鎖)。管理人員找了找發現有一張學生證,于是便給了小明。

小明拿到了學生證,順利進入超市(獲取鎖成功,進入臨界區),并坐上了操作臺前,登錄了自己的賬號系統(準備好工作內存,開始執行臨界區代碼)

小明此行的目的是為了拿走一個蘋果,于是他點擊了蘋果商品的圖標,系統顯示蘋果還有 4 個。

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

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

接著操作臺上顯示了 3 號,同樣通過學校大屏幕通知給了所有人。ID 為 3 號的學生小張看到了自己的號碼,得知自己獲得了進入超市操作控制臺的權利,于是出發前往超市。

小張和小明做著完全相同的操作,但小張操作太慢了,剛剛點擊完了蘋果商品的圖標,系統就顯示了下一個人的號碼 5 號。此時小張只能被迫終止自己的操作,讓出操作臺的權利(線程切換)

ID 為 5 號的學生小王接到通知,興沖沖地前往超市,并在領證處問管理人員,“給我一張學生證!”。

管理人員找了找,發現學生證已經被小明取走了,只能告訴小王,“抱歉,學生證暫時沒有,請到后面的學生證等待區(同步隊列 WaitQueue)排隊吧!”(獲取鎖失敗)

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

小張此時還在超市里(不釋放鎖),并不需要重新進入,于是他趕緊到操作臺前繼續著剛剛的操作(線程切換,繼續執行中斷的代碼),取走了一個蘋果,離開了超市,交還了學生證(釋放鎖)

此時領證處的管理人員收到了學生證,對著后面的學生證排隊區喊,“學生證有啦,排隊的人過來取吧!”(通知同步隊列出隊)

正在排隊等證的 5 號小王聽到后,從排隊的隊列里出來,準備領證并進入超市。但此時操作臺上顯示的號是另一個學生 10 號,10 號學生拿走了學生證,進入超市開始操作。

操作到一半,操作臺時間限制又到了,顯示了小王的 ID 5 號。小王剛從等待領證的隊列里出來,終于獲得了進行下一步行動的準許,于是走向了領證處,“給我一張學生證!”。

由于學生證已經被 10 號拿走,管理人員只能說,“抱歉,學生證暫時沒有,請到后面的學生證等待區排隊吧!”

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

等 10 號操作完出來了,還了學生證,小王又被領證處管理員喊話,“學生證有啦,排隊的人過來取吧!”。

小王走出排隊區,而此時操作臺終于顯示了小王的號碼 5 號。小王這次順利領取了學生證,進入了超市,坐在了操作臺上,登錄了自己的系統。

小王想買蘋果,于是點擊了蘋果商品的按鈕,但系統顯示蘋果數量為 0!

小王此時想了想,有了個接下來的計劃:

  • 繼續呆在超市里,得空就去操作臺上查詢一下蘋果的數量,直到有蘋果為止。但繼續呆在超市里,可能導致想向超市送蘋果的學生拿不到學生證,而自己也就永遠無法得到蘋果了,顯然不妥。(Sychronized 代碼塊里循環等待)

  • 所以小王的另一個想法是,走出超市,交還學生證,等下次有機會再進入超市查看蘋果數量,直到有蘋果為止。這樣雖然有機會得到蘋果,但太累了,假如這期間根本沒人往超市送蘋果,那這一趟趟其實是白費事的。(Sychronized 代碼塊外循環等待)

  • 于是小王想出了一個聰明的方案,我可以走出超市,到一個地方等待(Wait),在這里不會收到操作臺的通知。如果有人向超市送蘋果了,那這個等待區里會發一個信號(Notify),這時超市才有可能是有蘋果的,這時我從等待區里出來,等待叫號的機會。

雖然蘋果有可能被其他吃蘋果的學生搶沒,但這樣起碼不會浪費太多時間。(等待通知機制)

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

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

這時小孫走進了超市,給超市添置了 5 個蘋果,并換來了零花錢。之后他立刻通知蘋果沒了等待區,給了個信號“超市有蘋果啦!(AppleNotEmpty.notifyAll)”,但此時小孫還沒有走出超市呢(Notify 不釋放鎖)

小王在等待區里收到信號,立刻走出了等待區,等待被叫號,以完成自己吃蘋果的任務。

但很不幸,在小王得到叫號機會之前,蘋果又被其他幾個學生搶光了,這時才輪到小王。

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

接下來的時間里,小王不斷在蘋果沒了等待區和學生證等待區移動,小王發現為了吃一個蘋果太難了,必須同時滿足,蘋果沒了等待區發來了“超市有蘋果了”的信號,領證區此時有學生證,并且在操作臺上查詢出的蘋果數量不為 0。

終于有一次。小王成功滿足了這三個條件,在操作臺上看到蘋果的數量為 1!小王正激動地準備按下購買按鈕,可此時操作臺一閃,突然出現了別人的號碼。

這個人是超市管理員,拿著一張特殊的超市管理員證順利進入了超市,將蘋果拿走,此時蘋果數量又變成了 0。

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

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

于是,操作臺對根本沒有蘋果的儲藏區發出了取蘋果的指令,該系統根本沒有想到會有這種事情發生,于是機器炸了,小王犧牲(拋出運行時異常,線程釋放鎖并終止)

數年后,之前做操作臺的人已經被槍斃了,學校又高薪聘請了一位高人來建造,解決了之前的那個問題(Volatile)

超市又順利運轉起來,有時超市只有一個人(不同線程進入鎖對象相同的臨界區會互斥,只有一個線程可以進入),有時超市會有三個人(不同鎖對象的臨界區不互斥),分別是學生、老師、宿管阿姨,他們仨人互不影響,相安無事。學校的生活再次豐富了起來。

故事講完了,雖然不能解釋全部并發編程的內容,也不能處處都很恰當地說明細節,但卻是一個很有趣的思考過程。

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

下面整理一下故事中出現的東西和寓意:

東西寓意
線程
通行證鎖對象
水果超市臨界區代碼
水果受保護資源
操作臺CPU
叫號時間片分配
領證處獲取鎖
等待區等待隊列
領證排隊區同步隊列
水果儲藏區主內存
每個人的賬號系統工作內存
?

?

總結

以上是生活随笔為你收集整理的忘掉 Java 并发,先听完这个故事。。。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91网站在线观看视频 | 亚洲成人少妇 | 日本五十熟hd丰满 | 亚洲精品污 | 亚洲综合一二三 | 成年人一级黄色片 | 视频一区二区不卡 | 国产女女做受ⅹxx高潮 | 丝袜制服中文字幕 | 成人免费高清视频 | 自拍视频在线观看 | 中国a一片一级一片 | 精品国产一区一区二区三亚瑟 | 成人免费一级视频 | 欧美aaaaaaaaa | 久久久视频在线观看 | 国产一区在线播放 | 中文字幕亚洲欧美日韩 | 国产成人免费看一级大黄 | 国产综合一区二区 | 久久久久久亚洲 | 久久久久亚洲AV成人网人人小说 | 天天操天天干天天 | 午夜激情久久久 | 国产片黄色| 精品乱子伦一区二区三区 | 精品视频在线一区二区 | 欧美mv日韩mv国产网站app | 久久精品天天中文字幕人妻 | 国产麻豆一精品一男同 | 国产精品视频看看 | 亚洲免费区 | 亚洲手机av | 亚洲国产精品成人午夜在线观看 | 国产精品第五页 | 未满十八岁禁止进入 | 国产精品白浆一区二小说 | 老色批永久免费网站www | 国产视频欧美 | 国产欧美综合一区二区三区 | 成人av一区二区三区在线观看 | 男人懂的网站 | 小俊大肉大捧一进一出好爽 | 日本aⅴ在线观看 | 国产三级在线免费 | 真人抽搐一进一出视频 | 91成品人影院 | 右手影院亚洲欧美 | 蜜桃成熟时李丽珍在线观看 | 天堂色播| 少妇三级全黄 | 秋霞av一区二区三区 | 精品成人一区二区 | 一级黄色性片 | 国产偷自拍视频 | 亚洲精品乱码久久久久久自慰 | 色999日韩| 欧美日韩高清丝袜 | www.色在线 | 日韩人妻无码精品久久久不卡 | 五月婷婷激情综合 | 精品少妇人妻一区二区黑料社区 | 国产盗摄在线观看 | 人妻丰满熟妇岳av无码区hd | 黄网地址 | 日本不卡视频在线播放 | 91丨九色丨黑人外教 | 成人午夜视频免费看 | 天天干天天上 | 免费的一级片 | 污导航在线观看 | 嫩草网站入口 | 国产色网站 | 久久精品香蕉视频 | 木下凛凛子av一区二区三区 | 亚洲欧美成人一区 | 一区二区xxx | 女女同性女同一区二区三区按摩 | 成人免费直播 | 黄a在线观看 | av网址在线播放 | 天堂精品久久 | 人妻在线日韩免费视频 | 天天色天天 | 国产女主播喷水视频在线观看 | 夜色伊人| 成人午夜免费福利视频 | 天天爽天天射 | 久久影院一区二区 | 欲求不满的岳中文字幕 | 婷婷久久一区 | 91文字幕巨乱亚洲香蕉 | 91亚洲在线 | 东北少妇高潮抽搐 | 日本成人中文字幕 | 成人一级片 | aaa大片十八岁禁止 中文字幕亚洲在线观看 | 91视频在线观看视频 | 日韩女同一区二区三区 |