為什麼使用
volatile
比同步代價更低?
同步的代價,
主要由其覆蓋範圍決定,
如果可以降低同步的覆蓋範圍,
則可以大幅提公升程式效能。
而volatile
的覆蓋範圍僅僅變數級別的。
因此它的同步代價很低。
volatile
原理是什麼?
volatile
的語義,
其實是告訴處理器,
不要將我放入工作記憶體,
請直接在主存操作我。
因此,當多核或多執行緒在訪問該變數時,
都將直接操作主存,
這從本質上,
做到了變數共享。
volatile
的有什麼優勢?1、
更大的程式吞吐量2、
更少的**實現多執行緒3、
程式的伸縮性較好4、
比較好理解,
無需太高的學習成本
volatile
有什麼劣勢?
1、容易出問題
2、比較難設計
volatile
運算存在髒資料問題
volatile
僅僅能保證變數可見性,
無法保證原子性。
volatile
的race condition
示例:public class testracecondition
public int getvalue()
}當多執行緒執行
increase
方法時,
是否能保證它的值會是線性遞增的呢?
答案是否定的。
原因:這裡的
increase
方法,執行的操作是
i++,
即i = i + 1;針對
i = i + 1
,在多執行緒中的運算,
本身需要改變
i的值。
如果,在
i已從記憶體中取到最新值,
但未與1
進行運算,
此時其他執行緒已數次將運算結果賦值給
i.則當前執行緒結束時,
之前的數次運算結果都將被覆蓋。
即,執行
100次
increase
,可能結果是
< 100.
一般來說,
這種情況需要較高的壓力與併發情況下,
才會出現。
如何避免這種情況?
解決以上問題的方法:
一種是操作時,
加上同步。
這種方法,
無疑將大大降低程式效能,
且違背了
volatile
的初衷。
第二種方式是,使用硬體原語(
cas),
實現非阻塞演算法
從cpu
原語上,
支援變數級別的低開銷同步。
cpu原語
-比較並交換(
compareandset
),實現非阻塞演算法
什麼是cas
?cas
是現代cpu
提供給併發程式使用的原語操作。
不同的cpu
有不同的使用規範。
在intel
處理器中,比較並交換通過指令的
cmpxchg
系列實現。
powerpc
處理器有一對名為
「載入並保留」和
「條件儲存
」的指令,它們實現相同的目地;
mips
與powerpc
處理器相似,除了第乙個指令稱為
「載入鏈結」。
cas
操作包含三個運算元
—— 記憶體位置(
v)、預期原值(
a)和新值(b)
這部分我也不太懂哦~
volatile的應用與原理
背景 多執行緒開發中,不少見 volatile,其很典型的標記就是可見性,接下來一起了解一下其原理吧 定義volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變數的 可見性 可見性的意思是乙個執行緒修改乙個共享變數時,另外乙個執行緒能讀到這個修改的值 volatile...
volatile實現原理
via yzwall技術筆記 volatile變數寫,彙編指令會多出lock字首,lock字首在多核處理器下的作用 針對編譯器重排序 jmm針對編譯器指定了volatile重排序規則表,規定哪些先後操作不能進行編譯器重排序 針對處理器重排序 編譯器在生成位元組碼指令時,通過在指令序列中插入記憶體屏障...
volatile實現原理
首先我們來討論一種情況,現在有兩個執行緒,乙個是讀執行緒,讀取乙個共享資料並列印,乙個是寫執行緒,更新共享資料,這樣乙個情形的原理是什麼樣的?這樣會出現乙個什麼樣的問題呢?就是乙個寫執行緒將資料讀取到記憶體更新的時候,讀執行緒去讀取這個資料,導致讀寫執行緒的資料不一致。這個有什麼解決方案呢?主存中的...