枚举创建单例的模式的优势比较:
方式 | 优点 | 缺点 |
---|---|---|
饿汉式 | 线程安全, 调用效率高 | 不能延迟加载 |
懒汉式 | 线程安全, 可以延迟加载 | 调用效率不高 |
双重检测锁 | 线程安全, 调用效率高, 可以延迟加载 | - |
静态内部类 | 线程安全, 调用效率高, 可以延迟加载 | - |
枚举 | 线程安全, 调用效率高 | 不能延迟加载 |
枚举创建单例模式的案例如下:
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);
}
}