三個要素
1、私有的構(gòu)造方法
2、指向自身的靜態(tài)實例引用
3、公有的靜態(tài)的獲取自身實例方法
餓漢式
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return singleton;
}
}
懶漢式
public class Singleton{
private static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
但是以上方式在多線程環(huán)境下會出現(xiàn)問題,可能會new出來多個實例。
固需加鎖,但是直接在方法上加synchronized關(guān)鍵字,每次獲取實例都會加鎖,而事實上只需在創(chuàng)建實例的時候才需加鎖。故將getInstance方法改成如下:
public static Singleton getInstance() {
if (singleton== null) {
synchronized (singleton) {
if (singleton== null) {
singleton= new Singleton();
}
}
}
return singleton;
}
當(dāng)然也可以將創(chuàng)建實例的過程與獲取實例的過程分開。