volatile變量

1.volatile的原理

volatile的原理實際上是告訴處理器,不要把變量緩存在寄存器或者相對於其他處理器不可見的地方,而是把變量放在主存,每次讀寫操作都在主存上進行操作。另外,被申明爲volatile的變量也不會與其它內存中的變量進行重排序。

2.volatile與同步

volatile是同步的一個子集,只保證了變量的可見性,但是不具備原子特性。這就是說線程能夠自動發現 volatile 變量的最新值。

相對於同步而言,volatile的優勢

a.簡易性,可以像使用其他變量一樣使用volatile變量

b.volatile變量不會造成線程阻塞。

c.如果讀操作遠遠大於寫操作,volatile 變量還可以提供優於鎖的性能優勢。

3.正確使用volatile的條件

對變量的寫操作不依賴於當前值。

該變量沒有包含在具有其他變量的不變式中。

對於第一條,

private volatile int i=1;
 
...
 
i++;

雖然i++只有一條語句,實際上這條語句是分三步執行的

讀入i,i加1,寫入i。

若在第三步執行過程前,其他線程對i進行了改動,此時的結果將是錯的。因此即使使用了volatile進行控制,並不能保證這個操作是線程安全的。

這類問題的解決方案有兩種:

一種是採用synchronized進行同步控制,這顯然違背了volatile的初衷

一種是採用CPU原語進行控制。在jdk1.5之後,java.util.concurrent.atomic包下的很多類就是採用這種方式進行控制,這樣可以在保持性能的情況下,保證數據的線程安全。



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