volatile內存語義(1)

volatile的特性
理解volatile特性的一個好方法是把對volatile變量的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步。下面通過具體的實列來說明:

class VolatileFeaturesExample{
 volatile long v1=0L;
 //單個volatile變量的寫
   public void set(long l){
  v1=l;
  }
//多個操作,整體不具備原子性
public void getAndIncrement(){
v1++;
}
//單個volatile變量的讀
public long get(){
 return v1;
}

}
class VolatileFeaturesExample{
 long v1=0L;
 //上鎖
 public synchronized void set(long l){
  v1=l;
  }
//多個操作,整體不具備原子性
public void getAndIncrement(){
v1++;
}
//上鎖
public synchronized long get(){
 return v1;
}
}

如上面示例程序所示,一個volatile變量的單個讀/寫操作,與一個普通變量的讀/寫操作都是使用同一個鎖來同步,它們之間的執行效果相同。
鎖的happens-before規則保證釋放鎖和獲取鎖的兩個線程之間的內存可見性,這意味着對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入。
鎖的語義決定了臨界區代碼的執行具有原子性,對該變量的讀/寫就具有原子性。這意味着,即使64位的long型和double型變量,只要他是volatile變量,對該變量的讀/寫就具有原子性。如果是多個volatile操作或類式於volatile++這鐘複合操作,這些操作整體上不具有原子性。
簡而言之,volatile變量自身具有以下特性:
可見性:讀一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最後的寫入
原子性: 對任意單個volatile變量的讀/寫具有原子性,但類式於volatile++這種複合操作不具有原子性

以上內容摘抄於《Java併發編程藝術》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章