餓漢模式
public class Singleton {
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
這種方式在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快。這種方式基於類加載機制避免了多線程的同步問題,但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化instance顯然沒有達到懶加載的效果。 (就寫餓漢模式,上來就new)
懶漢模式(線程不安全)
//懶漢模式(線程不安全)
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
懶漢模式申明瞭一個靜態對象,在用戶第一次調用時初始化,雖然節約了資源,但第一次加載時需要實例化,反映稍慢一些,而且在多線程不能正常工作。
懶漢模式(線程安全)
//線程安全
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
這種寫法能夠在多線程中很好的工作,但是每次調用getInstance()方法時都需要進行同步,造成不必要的同步開銷,而且大部分時候我們是用不到同步的,所以不建議用這種模式。