Java—關於單例模式的實現方式

1.餓漢式(線程安全,調用效率高,但是不能延時加載):JVM初始化的時候創建對象,不能延時

public class ImageLoader{ 
     private static ImageLoader instance = new ImageLoader; 
     private ImageLoader(){} 
     public static ImageLoader getInstance(){  
          return instance;  
      } 
}

2.懶漢式(線程安全,調用效率不高,但是能延時加載):

public class SingletonDemo2 {
     
    //類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)
    private static SingletonDemo2 instance;
     
    //構造器私有化
    private SingletonDemo2(){}
     
    //方法同步,調用效率低
    public static synchronized SingletonDemo2 getInstance(){
        if(instance==null){
            instance=new SingletonDemo2();
        }
        return instance;
    }
}

3.靜態內部類實現方式(線程安全,調用效率高,可以延時加載):

public class SingletonDemo3 {

    private static class SingletonClassInstance{
        private static final SingletonDemo3 instance=new SingletonDemo3();
    }

    private SingletonDemo3(){}

    public static SingletonDemo3 getInstance(){
        return SingletonClassInstance.instance;
    }

}

4.枚舉類(線程安全,調用效率高,不能延時加載,可以天然的防止反射和反序列化調用):

枚舉就是在一個類裏定義幾個靜態變量,每個變量都是這個類的實例。

public enum SingletonDemo4 {

    //枚舉元素本身就是單例
    INSTANCE;

    //添加自己需要的操作
    public void singletonOperation(){
    }
}

如何選用:

-單例對象 佔用資源少,不需要延時加載,枚舉 好於 餓漢

-單例對象 佔用資源多,需要延時加載,靜態內部類 好於 懶漢式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章