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