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

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

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

難度中級
時長57分
學習人數
綜合評分9.63
181人評價 查看評價
9.9 內容實用
9.6 簡潔易懂
9.4 邏輯清晰
老師可以發下ppt嗎
個人理解:不加volatile的普通變量不具有這個效果,比如線程對工作變量修改完之后,不會百分百對主內存也修改,有可能改完自己工作變量后休眠了,一直不去對主內存中的變量進行修改。但是線程對volatile變量會綁定對主內存變量也修改的操作,也可以說對volatile變量的修改 有一個 “對自己工作區變量修改并且綁定了一個對主內存變量修改”的原子性的操作。
個人一個比較淺顯的理解就是:
synchronized就是互斥鎖,實現底層就是總線鎖,當一個線程獲得該鎖時,其他線程就會進入阻塞狀態,從而不能進行操作。
而volatile則不同,它有點像緩存鎖,但是又不像鎖。volatile變量在執行寫操作時,會加入store的屏障指令,我的理解是這時其他線程不能能對該共享變量做出任何操作,但是可以操作其他共享變量。這時volatile的開銷就比synchronized小。

最贊回答 / 慕前端6229441
共享變量是在多線程操作的情況下,對某一個變量都有進行操作,該變量存儲在主存中,但是在多線程的工作內存中都有一個副本,所以該變量是共享的,即為共享變量。 volatile變量是被該關鍵字修飾的變量。在單線程中也可以用來修飾變量,但是沒有意義。用在多線程中,是為了保證被其修飾的變量對于多線程來說都是內存可見的。 在多線程中,volatile用來修飾共享變量,實現共享變量的可見性。
講的不錯,受教了!

已采納回答 / 自有如風
你看看這樣能不能理解:number的值可以存在三個地方:主內存,cpu緩存,cpu寄存器。因為加上了volatile關鍵字,cpu每次對number的讀取都強迫cpu緩存從主內存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結果給count。假設讀count已經執行了,number已經放到了cpu寄存器中。此時當執行權被其他線程搶走之后再次輪到當前線程執行的時候,已經不需要再讀number了。故number還是沒有變化
講得很好!受教了
看到有人評論加入synchronized后仍然有0出現的問題。
我的理解是:synchronized的作用是保證同步代碼塊中只能有一個線程在訪問,另外在訪問的時候,其他線程 不能訪問 其他synchronized同步代碼塊。所以結果有 0 和 6,是正常的。
加 synchronized 并不能解決結果可能出現 0 的問題,有點誤人子弟啊
volatile 能實現可見性 但是 synchronized 只能實現線程安全吧

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

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

已采納回答 / 我是貓_夏
互斥鎖,同一時間,只能 有一個線程持有該對象的引用,對該對象進行操作
老師幸苦了
非常感謝老師!老師受累了!
贊講的太好了
課程須知
學習本課程前,你需要熟練掌握Java的基礎語法,熟悉Java多線程的基礎知識,以及synchronized實現線程同步的方法。
老師告訴你能學到什么?
1、內存可見性 2、指令重排序 3、as-if-serial語義 4、synchronized實現可見性 5、volatile實現可見性

微信掃碼,參與3人拼團

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

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

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?

舉報

0/150
提交
取消