課程
/后端開發
/Java
/深入淺出Java多線程
當from里能量少于amount時候,返回return。為什么這里就會產生爭用條件呢?為什么只要讓這里開始wait
2018-04-18
源自:深入淺出Java多線程 4-2
正在回答
這里存在一個概念性問題:工作內存 和? 主內存
線程操作數據時:會將主內存中的數值read ->load 到工作內存中
線程操作完成后:工作內存中的數據 store ->write 到主內存中
這里畫了一個圖解釋一下:
線程1獲取到資源后進行一系列的操作(獲取到a ,并進行修改為5500,還未來得及再次寫去主內存中),在某一時刻線程進入了阻塞狀態;
此時線程2隆重登場 :線程而進行了全套操作(獲取到a ,并進行修改為5900,再存入主內存中),此時資源a被釋放,線程1繼續操作,將5500寫入主內存中,
全程a的變化為 :5000->5900->5500也就是最終值為5500,而在線程2操作時有一個數組數值減少了900,線程1操作時有一個數組數值減少了500,這里a只多了500,所以就造成不守恒了。(因為操作哪一個數是隨機的,這里操作目標數值是同一個 a )。
當返回return后,EnergySystemTest中的一個循環結束,這個循環后面的代碼也不會去執行,而新的一個循環開始時就有可能爭用數據a ,這里造成了爭用產生。
使用wait 后,當線程1操作被中斷后進入wait set集合等待,只有線程完全執行完以后,調用notify方法,此時才能喚醒線程繼續往下執行。
注意兩個方法區別:return 會讓兩個線程只有一次最終結果的輸出;wait可以有兩次輸出。
慕瓜7073846 提問者
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
1 回答為什么我的能量不守恒呢
2 回答能量守恒中是否會出死鎖的問題?
2 回答貌似上鎖之后還是會不守恒
4 回答為啥老師的程序在我的機器上跑能量是守恒的
2 回答爭用條件問題
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-04-19
這里存在一個概念性問題:工作內存 和? 主內存
線程操作數據時:會將主內存中的數值read ->load 到工作內存中
線程操作完成后:工作內存中的數據 store ->write 到主內存中
這里畫了一個圖解釋一下:
線程1獲取到資源后進行一系列的操作(獲取到a ,并進行修改為5500,還未來得及再次寫去主內存中),在某一時刻線程進入了阻塞狀態;
此時線程2隆重登場 :線程而進行了全套操作(獲取到a ,并進行修改為5900,再存入主內存中),此時資源a被釋放,線程1繼續操作,將5500寫入主內存中,
全程a的變化為 :5000->5900->5500也就是最終值為5500,而在線程2操作時有一個數組數值減少了900,線程1操作時有一個數組數值減少了500,這里a只多了500,所以就造成不守恒了。(因為操作哪一個數是隨機的,這里操作目標數值是同一個 a )。
當返回return后,EnergySystemTest中的一個循環結束,這個循環后面的代碼也不會去執行,而新的一個循環開始時就有可能爭用數據a ,這里造成了爭用產生。
使用wait 后,當線程1操作被中斷后進入wait set集合等待,只有線程完全執行完以后,調用notify方法,此時才能喚醒線程繼續往下執行。
注意兩個方法區別:return 會讓兩個線程只有一次最終結果的輸出;wait可以有兩次輸出。