課程
/后端開發
/Java
/細說Java多線程之內存可見性
會不會是因為你的線程在sleep,然后在主線程的while循環中的判斷條件不滿足了,就是因為有些線程還在sleep,判定的就不是處于active狀態,就進行了getNumber的操作,所以才會有這么明顯的體現。
2017-07-07
源自:細說Java多線程之內存可見性 4-3
正在回答
while循環內判斷的是所有的子線程是否都運行完了,如果是的話,繼續下面的打印操作。
如果不用synchronized或不加鎖,程序運行時,有時候getNumber獲得的值小于500,是因為volatile定義的變量不能保證原子性,所以會出現兩個線程同時寫number時,number只增加了1,沒有增加2,所以影響到number變量最終的值不是500,而是499或498了。
xiong520 提問者
舉報
用兩種方式實現內存可見性,代領大家深層次學習Java中的內存
1 回答為什么了加入sleep后,結果會變得明顯?
5 回答sleep作用
2 回答用Join關鍵字替換While那個判斷效果是一樣的嘛?
2 回答關于long和double非原子性的解決辦法
2 回答關于同步鎖,你在主線程里寫的那個不會進行重排序?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-07-08
while循環內判斷的是所有的子線程是否都運行完了,如果是的話,繼續下面的打印操作。
如果不用synchronized或不加鎖,程序運行時,有時候getNumber獲得的值小于500,是因為volatile定義的變量不能保證原子性,所以會出現兩個線程同時寫number時,number只增加了1,沒有增加2,所以影響到number變量最終的值不是500,而是499或498了。