為什麼使用volatile比同步代價更低?
同步的代價
而volatile的覆蓋范圍僅僅變量級別的
volatile原理是什麼?
volatile的語義
因此
volatile的有什麼優勢?
volatile有什麼劣勢?
volatile運算存在髒數據問題
volatile僅僅能保證變量可見性
volatile的race condition示例
public class TestRaceCondition {
private volatile int i =
public void increase() {
i++;
}
public int getValue() {
return i;
}
}
當多線程執行increase方法時
答案是否定的
原因
這裡的increase方法
針對i = i +
如果
則當前線程結束時
即
一般來說
如何避免這種情況?
解決以上問題的方法
一種是 操作時
這種方法
第二種方式是
從CPU原語上
CPU原語
什麼是CAS?
cas是現代CPU提供給並發程序使用的原語操作
在 Intel 處理器中
PowerPC 處理器有一對名為
MIPS 與 PowerPC 處理器相似
CAS 操作包含三個操作數 —— 內存位置(V)
什麼是非阻塞算法?
一個線程的失敗或掛起不應該影響其他線程的失敗或掛起
對比阻塞算法
如果有一類並發操作
直到前一個線程釋放掉鎖後
CAS 原理
我認為位置 V 應該包含值 A
CAS使用示例(jdk
/**
* Atomically sets to the given value and returns the old value
*
* @param newValue the new value
* @return the previous value
*/ public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current
return current;
}
}
public final boolean compareAndSet(int expect
return pareAndSwapInt(this
}
這個方法是
它利用了cpu原語compareAndSet來保障值的唯一性
另
比如 getAndIncrement
CAS語義上存在的
什麼是ABA問題?
假設
但是
此時
這種判斷值的方式來斷定內存是否被修改過
為了解決這種問題
其實
jdk
包的特色
但不包括對其的計算
AtomicIntegerArray
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27580.html