1. 程式人生 > >列舉建立單例模式和懶漢式加鎖單例模式分析與比較

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

列舉建立單例的模式的優勢比較:

方式優點缺點
餓漢式執行緒安全, 呼叫效率高不能延遲載入
懶漢式執行緒安全, 可以延遲載入呼叫效率不高
雙重檢測鎖執行緒安全, 呼叫效率高, 可以延遲載入-
靜態內部類執行緒安全, 呼叫效率高, 可以延遲載入-
列舉執行緒安全, 呼叫效率高不能延遲載入

列舉建立單例模式的案例如下:

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);
}
}