枚舉創建單例模式和懶漢式加鎖單例模式分析與比較

枚舉創建單例的模式的優勢比較:

方式優點缺點
餓漢式線程安全, 調用效率高不能延遲加載
懶漢式線程安全, 可以延遲加載調用效率不高
雙重檢測鎖線程安全, 調用效率高, 可以延遲加載-
靜態內部類線程安全, 調用效率高, 可以延遲加載-
枚舉線程安全, 調用效率高不能延遲加載

枚舉創建單例模式的案例如下:

1:創建一個類實現對象的調用

public class Resource {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

2:創建一個枚舉實現單例模式的創建

public enum SomeThing {
   INSTANCE;//任意常量名稱,實現數據的調用SomeThing.INSTANCE.getInstance();
    private Resource instance;
    SomeThing() {
        instance = new Resource();
    }
    public Resource getInstance() {
        return instance;
    }

}

3:創建一個測試類實現對單例模式的測試

public class Testdemo {
public static void main(String[] args) {
Resource instance1 = SomeThing.INSTANCE.getInstance();
Resource instance2 = SomeThing.INSTANCE.getInstance();//同一個對象
instance1.setName("123123");
System.out.println(instance1);
System.out.println(instance2);
}

}

創建懶漢式加鎖的單例模式

/**
 * 懶漢式之加鎖處理單據模式
 * @author cwh
 * @date 2018-4-20 上午11:08:13
 */
public class DoubleCheckSingleton {


    /**
     * 需要使用volatile
     * 保證所有的寫(write)都將先行發生於讀(read)
     */
    private static volatile DoubleCheckSingleton instance;


    private DoubleCheckSingleton() {
    }


    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {                          //Single Checked
            synchronized (DoubleCheckSingleton.class) {
                if (instance == null) {                  // Double Checked
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
    public static void main(String[] args) {
    DoubleCheckSingleton instance1 = DoubleCheckSingleton.getInstance();
    DoubleCheckSingleton instance2 = DoubleCheckSingleton.getInstance();//同一個對象
    System.out.println(instance1);
    System.out.println(instance2);
}
}


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