在當前的Java記憶體模型下,線程可以把變數保存在本地記憶體(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變數的值,而另外一個線程還繼續使用它在寄存器中的變數值的拷貝,造成數據的不一致。 在當前的Java記憶體模型下,線程可以把變數保存在本地記憶體(比如機器的寄存 ...
在當前的Java記憶體模型下,線程可以把變數保存在本地記憶體(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變數的值,而另外一個線程還繼續使用它在寄存器中的變數值的拷貝,造成數據的不一致。
要解決這個問題,只需要把該變數聲明為volatile(不穩定的)即可,這就指示JVM,這個變數是不穩定的,每次使用它都到主存中進行讀取。一般說來,多任務環境下各任務間共用的標誌都應該加volatile修飾。volatile不保證原子操作,所以,很容易讀到臟數據。 當要訪問的變數已在synchronized代碼塊中,或者為常量時,不必使用volatile。