volatile原理與技巧

2021-05-22 19:42:39 字數 2015 閱讀 8670

為什麼使用

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實現原理

首先我們來討論一種情況,現在有兩個執行緒,乙個是讀執行緒,讀取乙個共享資料並列印,乙個是寫執行緒,更新共享資料,這樣乙個情形的原理是什麼樣的?這樣會出現乙個什麼樣的問題呢?就是乙個寫執行緒將資料讀取到記憶體更新的時候,讀執行緒去讀取這個資料,導致讀寫執行緒的資料不一致。這個有什麼解決方案呢?主存中的...