本文就圍繞volatile展開,主要介紹volatile的用法、volatile的原理,以及volatile是如何提供可見性和有序性保障的等。編程
volatile這個關鍵字,不單單在Java語言中有,在不少語言中都有的,並且其用法和語義也都是不盡相同的。尤爲在C語言、C++以及Java中,都有volatile關鍵字。均可以用來聲明變量或者對象。下面簡單來介紹一下Java語言中的volatile關鍵字。多線程
volatile的用法併發
volatile一般被比喻成"輕量級的synchronized",也是Java併發編程中比較重要的一個關鍵字。和synchronized不一樣,volatile是一個變量修飾符,只能用來修飾變量。沒法修飾方法及代碼塊等。線程
volatile的用法比較簡單,只須要在聲明一個可能被多線程同時訪問的變量時,使用volatile修飾就能夠了。code
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
如以上代碼,是一個比較典型的使用雙重鎖校驗的形式實現單例的,其中使用volatile關鍵字修飾可能被多個線程同時訪問到的singleton。對象