枚舉創建單例的模式的優勢比較:
方式 | 優點 | 缺點 |
---|---|---|
餓漢式 | 線程安全, 調用效率高 | 不能延遲加載 |
懶漢式 | 線程安全, 可以延遲加載 | 調用效率不高 |
雙重檢測鎖 | 線程安全, 調用效率高, 可以延遲加載 | - |
靜態內部類 | 線程安全, 調用效率高, 可以延遲加載 | - |
枚舉 | 線程安全, 調用效率高 | 不能延遲加載 |
枚舉創建單例模式的案例如下:
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);
}
}