課程
/后端開發
/Java
/細說Java多線程之內存可見性
這里為什么number的值改變了,線程A不會把主內存的值刷新到線程A中呢?跟前面講的變量可見性不矛盾了嗎?
2018-08-10
源自:細說Java多線程之內存可見性 4-3
正在回答
你看看這樣能不能理解:number的值可以存在三個地方:主內存,cpu緩存,cpu寄存器。因為加上了volatile關鍵字,cpu每次對number的讀取都強迫cpu緩存從主內存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結果給count。假設讀count已經執行了,number已經放到了cpu寄存器中。此時當執行權被其他線程搶走之后再次輪到當前線程執行的時候,已經不需要再讀number了。故number還是沒有變化
慕工程4835570 提問者
讀之前肯定是需要從主內存中讀,但是A已經讀取完了,就不必再去主內存中讀
是在讀取前刷新工作內存,從主內存中取值,現在已經讀取完了,就只操作工作內存了
不是很好理解嘛,A第一步是先讀取number的,因為不是原子性,后面操作的 +1和寫入主內存得最新值都沒有刷到A的工作內存中啊,別搞混了兄弟
b線程執行之后,主內存中number加1.假設輪到a線程執行,此時,a線程的工作內存和執行棧中number都是原來的值,但是它的執行棧中已經有該變量的值了,所以直接用了不去檢查其工作內存中該變量的值是否需要刷新。所以用的是原來的值,這種情況存在。
可見性和原子性并沒有關系,volatile能保證可見性,卻無法保證原子性,因而線程會被干擾
舉報
用兩種方式實現內存可見性,代領大家深層次學習Java中的內存
1 回答非主線程中使用的主線程變量必須是final的
1 回答加入有5個線程,某個變量在其中三個線程中有用到。這個變量算不算共享變量呢?
4 回答ReentrantLock也能夠保證線程之間內存的可見性嗎?
1 回答為什么兩個volatile變量在不變式中就會使得volatile線程不安全?
1 回答內存可見性是什么意思?與共享變量可見性有什么關系?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-10-22
你看看這樣能不能理解:number的值可以存在三個地方:主內存,cpu緩存,cpu寄存器。因為加上了volatile關鍵字,cpu每次對number的讀取都強迫cpu緩存從主內存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結果給count。假設讀count已經執行了,number已經放到了cpu寄存器中。此時當執行權被其他線程搶走之后再次輪到當前線程執行的時候,已經不需要再讀number了。故number還是沒有變化
2020-12-01
讀之前肯定是需要從主內存中讀,但是A已經讀取完了,就不必再去主內存中讀
2019-01-22
是在讀取前刷新工作內存,從主內存中取值,現在已經讀取完了,就只操作工作內存了
2018-11-17
不是很好理解嘛,A第一步是先讀取number的,因為不是原子性,后面操作的 +1和寫入主內存得最新值都沒有刷到A的工作內存中啊,別搞混了兄弟
2018-09-17
b線程執行之后,主內存中number加1.假設輪到a線程執行,此時,a線程的工作內存和執行棧中number都是原來的值,但是它的執行棧中已經有該變量的值了,所以直接用了不去檢查其工作內存中該變量的值是否需要刷新。所以用的是原來的值,這種情況存在。
2018-08-25
可見性和原子性并沒有關系,volatile能保證可見性,卻無法保證原子性,因而線程會被干擾