枚举创建单例模式和懒汉式加锁单例模式分析与比较

枚举创建单例的模式的优势比较:

方式优点缺点
饿汉式线程安全, 调用效率高不能延迟加载
懒汉式线程安全, 可以延迟加载调用效率不高
双重检测锁线程安全, 调用效率高, 可以延迟加载-
静态内部类线程安全, 调用效率高, 可以延迟加载-
枚举线程安全, 调用效率高不能延迟加载

枚举创建单例模式的案例如下:

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


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