亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

細說Java多線程之內存可見性

難度中級
時長57分
學習人數
綜合評分9.63
181人評價 查看評價
9.9 內容實用
9.6 簡潔易懂
9.4 邏輯清晰

已采納回答 / 特南克斯
main 線程是會和? new 出來的線程并行執行的,如果沒有那個 while 判斷,下面這行代碼<...code...>就會在其他線程執行完之前就執行了。加 while 判斷,就是為了等五百個線程執行完畢

已采納回答 / 自有如風
你看看這樣能不能理解:number的值可以存在三個地方:主內存,cpu緩存,cpu寄存器。因為加上了volatile關鍵字,cpu每次對number的讀取都強迫cpu緩存從主內存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結果給count。假設讀count已經執行了,number已經放到了cpu寄存器中。此時當執行權被其他線程搶走之后再次輪到當前線程執行的時候,已經不需要再讀number了。故number還是沒有變化

已采納回答 / 一葉秋才
這個Dome告訴你 編譯時可能存在其它結果,導致數據不安全
public?static?void?main(String[]?args)?{
????SynchronizedDemo?synchronizedDemo=new?SynchronizedDemo();

???????synchronizedDemo.new?ReadWriteThread(true).st...

已采納回答 / 我是貓_夏
互斥鎖,同一時間,只能 有一個線程持有該對象的引用,對該對象進行操作

已采納回答 / 再冷也要光著腳
還有一個監控線程的存在:Monitor Ctrl-Break 可以將活動線程數改為>2,具體原因你可以查下 百度上有很多 我就不粘貼了。。

已采納回答 / annnn
A線程的工作變量里已經讀過number=5,B線程改變以后number=6后,的確會強迫store到主內存,但是這與A線程的工作變量無關,A線程讀取的時候已經load過了,不會主動再load,所以number=5

最贊回答 / 你猜能
加了volatile就會一次讀寫,不會分為兩次讀寫。跟volatile不能保證原子性沒有關系。

已采納回答 / Peng_0008
加注釋,多次編譯,多次執行。

已采納回答 / 憂傷的帥哥
不管怎么重排序(編譯器和處理器為了提高并行度),(單線程)程序的執行結果不能被改變。java內存中的變量都有指針引用,上下文引用成鏈,這個鏈是不會被打亂重排序的,只有沒有數據依賴關系的代碼,才會被沖排序,所以在單線程內部重排序不會改變程序運行結果,這就是as-if-serial

已采納回答 / zvc888
每個線程都有一個自己的內存空間,當線程啟動的時候把變量從共享內存拷貝一份到私有內存,在這個變量更改后,需要push到共享內存,其他線程才能讀取到變量新的值;

已采納回答 / dky
靜態在共享區, ? 非靜態在堆內存,
首頁上一頁12下一頁尾頁
課程須知
學習本課程前,你需要熟練掌握Java的基礎語法,熟悉Java多線程的基礎知識,以及synchronized實現線程同步的方法。
老師告訴你能學到什么?
1、內存可見性 2、指令重排序 3、as-if-serial語義 4、synchronized實現可見性 5、volatile實現可見性

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?

舉報

0/150
提交
取消