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包下的很多類就是採用這種方式進行控制,這樣可以在保持性能的情況下,保證數據的線程安全。