public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
要保證單例抬驴,需要做一下幾步:
1.必須防止外部可以調(diào)用構(gòu)造函數(shù)進(jìn)行實例化敷搪,因此構(gòu)造函數(shù)必須私有化。
2.必須定義一個靜態(tài)函數(shù)獲得該單例
3.單例使用volatile修飾:用來修飾被不同線程訪問和修改的變量
4.使用synchronized 進(jìn)行同步處理蛛株,并且雙重判斷是否為null姚炕,我們看到synchronized (Singleton.class)里面又進(jìn)行了是否為null的判斷征唬,這是因為一個線程進(jìn)入了該代碼,如果另一個線程在等待吠式,這時候前一個線程創(chuàng)建了一個實例出來完畢后陡厘,另一個線程獲得鎖進(jìn)入該同步代碼,實例已經(jīng)存在特占,沒必要再次創(chuàng)建糙置,因此這個判斷是否是null還是必須的。