列舉建立單例模式和懶漢式加鎖單例模式分析與比較
列舉建立單例的模式的優勢比較:
方式 | 優點 | 缺點 |
---|---|---|
餓漢式 | 執行緒安全, 呼叫效率高 | 不能延遲載入 |
懶漢式 | 執行緒安全, 可以延遲載入 | 呼叫效率不高 |
雙重檢測鎖 | 執行緒安全, 呼叫效率高, 可以延遲載入 | - |
靜態內部類 | 執行緒安全, 呼叫效率高, 可以延遲載入 | - |
列舉 | 執行緒安全, 呼叫效率高 | 不能延遲載入 |
列舉建立單例模式的案例如下:
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);
}
}