個人理解:不加volatile的普通變量不具有這個效果,比如線程對工作變量修改完之后,不會百分百對主內(nèi)存也修改,有可能改完自己工作變量后休眠了,一直不去對主內(nèi)存中的變量進行修改。但是線程對volatile變量會綁定對主內(nèi)存變量也修改的操作,也可以說對volatile變量的修改 有一個 “對自己工作區(qū)變量修改并且綁定了一個對主內(nèi)存變量修改”的原子性的操作。
2018-08-30
個人一個比較淺顯的理解就是:
synchronized就是互斥鎖,實現(xiàn)底層就是總線鎖,當一個線程獲得該鎖時,其他線程就會進入阻塞狀態(tài),從而不能進行操作。
而volatile則不同,它有點像緩存鎖,但是又不像鎖。volatile變量在執(zhí)行寫操作時,會加入store的屏障指令,我的理解是這時其他線程不能能對該共享變量做出任何操作,但是可以操作其他共享變量。這時volatile的開銷就比synchronized小。
synchronized就是互斥鎖,實現(xiàn)底層就是總線鎖,當一個線程獲得該鎖時,其他線程就會進入阻塞狀態(tài),從而不能進行操作。
而volatile則不同,它有點像緩存鎖,但是又不像鎖。volatile變量在執(zhí)行寫操作時,會加入store的屏障指令,我的理解是這時其他線程不能能對該共享變量做出任何操作,但是可以操作其他共享變量。這時volatile的開銷就比synchronized小。
2018-08-14
最贊回答 / 慕前端6229441
共享變量是在多線程操作的情況下,對某一個變量都有進行操作,該變量存儲在主存中,但是在多線程的工作內(nèi)存中都有一個副本,所以該變量是共享的,即為共享變量。
volatile變量是被該關鍵字修飾的變量。在單線程中也可以用來修飾變量,但是沒有意義。用在多線程中,是為了保證被其修飾的變量對于多線程來說都是內(nèi)存可見的。
在多線程中,volatile用來修飾共享變量,實現(xiàn)共享變量的可見性。
2018-08-12
已采納回答 / 自有如風
你看看這樣能不能理解:number的值可以存在三個地方:主內(nèi)存,cpu緩存,cpu寄存器。因為加上了volatile關鍵字,cpu每次對number的讀取都強迫cpu緩存從主內(nèi)存中讀取。但是count++操作有三步,讀count,計算count+1,將計算的結果給count。假設讀count已經(jīng)執(zhí)行了,number已經(jīng)放到了cpu寄存器中。此時當執(zhí)行權被其他線程搶走之后再次輪到當前線程執(zhí)行的時候,已經(jīng)不需要再讀number了。故number還是沒有變化
2018-08-10
看到有人評論加入synchronized后仍然有0出現(xiàn)的問題。
我的理解是:synchronized的作用是保證同步代碼塊中只能有一個線程在訪問,另外在訪問的時候,其他線程 不能訪問 其他synchronized同步代碼塊。所以結果有 0 和 6,是正常的。
我的理解是:synchronized的作用是保證同步代碼塊中只能有一個線程在訪問,另外在訪問的時候,其他線程 不能訪問 其他synchronized同步代碼塊。所以結果有 0 和 6,是正常的。
2018-06-28
加 synchronized 并不能解決結果可能出現(xiàn) 0 的問題,有點誤人子弟啊
2018-06-24
已采納回答 / 一葉秋才
這個Dome告訴你 編譯時可能存在其它結果,導致數(shù)據(jù)不安全
public?static?void?main(String[]?args)?{ ????SynchronizedDemo?synchronizedDemo=new?SynchronizedDemo(); ???????synchronizedDemo.new?ReadWriteThread(true).st...
2018-06-07