可見性問題解決 加鎖和Volatile關鍵字

2021-10-05 19:25:13 字數 1183 閱讀 7708

加鎖

為啥加鎖可以解決可見性問題呢?

因為某乙個執行緒進入synchronized**塊前後,執行緒會獲得鎖,清空工作記憶體,從主記憶體拷貝共享變數最新的值到工作記憶體成為副本,執行**,將修改後的副本的值重新整理回主記憶體中,執行緒釋放鎖。

而獲取不到鎖的執行緒會阻塞等待,所以變數的值肯定一直都是最新的。

volatile修飾共享變數

每個執行緒運算元據的時候會把資料從主記憶體讀取到自己的工作記憶體,如果他操作了資料並且寫會了,他其他已經讀取的執行緒的變數副本就會失效了,需要都資料進行操作又要再次去主記憶體中讀取了。

volatile保證不同執行緒對共享變數操作的可見性,也就是說乙個執行緒修改了volatile修飾的變數,當修改寫回主記憶體時,另外乙個執行緒立即看到最新的值。

volatile只能修飾例項變數和類變數,而synchronized可以修飾方法,以及**塊。

volatile保證資料的可見性,但是不保證原子性(多執行緒進行寫操作,不保證執行緒安全);而synchronized是一種排他(互斥)的機制。

volatile用於禁止指令重排序:可以解決單例雙重檢查物件初始化**執行亂序問題。

volatile可以看做是輕量版的synchronized,volatile不保證原子性,但是如果是對乙個共享變數進行多個執行緒的賦值,而沒有其他的操作,那麼就可以用volatile來代替synchronized,因為賦值本身是有原子性的,而volatile又保證了可見性,所以就可以保證執行緒安全了。

volatile修飾符適用於以下場景:某個屬性被多個執行緒共享,其中有乙個執行緒修改了此屬性,其他執行緒可以立即得到修改後的值,比如booleanflag;或者作為觸發器,實現輕量級同步。

volatile屬性的讀寫操作都是無鎖的,它不能替代synchronized,因為它沒有提供原子性和互斥性。因為無鎖,不需要花費時間在獲取鎖和釋放鎖_上,所以說它是低成本的。

volatile只能作用於屬性,我們用volatile修飾屬性,這樣compilers就不會對這個屬性做指令重排序。

volatile提供了可見性,任何乙個執行緒對其的修改將立馬對其他執行緒可見,volatile屬性不會被執行緒快取,始終從主 存中讀取。

volatile可以使得long和double的賦值是原子的。

volatile可以在單例雙重檢查中實現可見性和禁止指令重排序,從而保證安全性。

volatile

可見性 原子性和有序性問題

核心矛盾 這些年,我們的 cpu 記憶體 i o 裝置都在不斷迭代,不斷朝著更快的方向努力。但是,在這個快速發展的過程中,有乙個核心矛盾一直存在,就是這三者的速度差異。我形象的描述了一下這三者的速度上的差異 所謂天上一天地上一年 愛因斯坦的相對論是有合理解釋的 cpu和記憶體之間的速度差異就是cpu...

web開發相容性問題解決

web開發相容性問題解決 1 居中問題 div裡的內容,ie預設為居中,而ff預設為左對齊,可以嘗試增加 margin 0 auto 2 高度問題 兩上下排列或巢狀的div,上面的div設定高度 height 如果div裡的實際內容大於所設高度,在ff中會出現兩個div重疊的現象 但在ie中,下面的...

setAttribute 的相容性問題解決

class和classname相容方法 object.setattribute class content 在ie8 chrome 火狐 opera10中都能設定成功 但是在ie7下無法設定。object.setattribute classname content 只有ie7能設定成功,但是其他瀏...