常见的五种单例模式实现方式
主要
- 饿汉式(线程安全,调用效率高,但是不能延时加载)
- 懒汉式(线程安全,调用效率不高,但是,可以延时加载)
其他:
- 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用
- 静态内部类式(线程安全,调用效率高,但是可以延时加载)
- 枚举式(线程安全,调用效率高,不能延时加载,并且可以天然的防止反射和反序列化漏洞)
如何选择?
单例对象 占用 资源少,不需要 延时加载
枚举类类 好于 饿汉式单列对象 占用 资源大 需要延时加载
静态内部类 好于懒汉式
饿汉式单列
package com.hejun.singleton;
//测试饿汉式单例模式
public class SingletonDemo1 {
//类初始化时,立即加载这个对象(没有延时加载的优势),加载类时,天然的是线程安全
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
//方法没有同步,调用效率高
public static SingletonDemo1 getInstance() {
return instance;
}
}
懒汉式
package com.hejun.singleton;
//测试懒汉式单例模式
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延时加载) 正在
private static SingletonDemo2 instance ;
private SingletonDemo2() {
}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance() {
if(instance==null) {
instance = new SingletonDemo2();
}
return instance;
}
}
双重检测锁式
package com.hejun.singleton;
public class SingletonDemo3 {
private static SingletonDemo3 instance = null ;
public static SingletonDemo3 getInstance() {
if(instance == null) {
SingletonDemo3 sc;
synchronized(SingletonDemo3.class) {
sc = instance;
if(sc==null) {
synchronized(SingletonDemo3.class) {
if(sc==null) {
sc = new SingletonDemo3();
}
}
instance = sc;
}
}
}
return instance;
}
private SingletonDemo3() {
}
}
静态内部类式
public class SingletonDemo4 {
private static class SingletonClassInstance{
private static final SingletonDemo4 instance = new SingletonDemo4();
}
public static SingletonDemo4 getInstance() {
return SingletonClassInstance.instance;
}
private SingletonDemo4() {
}
}
枚举类式
package com.hejun.singleton;
public enum SingletonDemo5 {
//定义一个枚举的元素,它就代表单列
INSTANCE;
//添加自己需要的操作
public void singletonOperation() {
}
}