单例模式应该算最简单的设计模式,但在Java中单例模式还是有不少坑的。
类初始化时直接加载,没有线程安全问题,但没有实现lazy loading
public class Singleton {
private static Singleton instance = new Singleton();
//私有化构造器
private Singleton() {}
//访问方法
public static Singleton getInstance() {
return instance;
}
}
不加锁,在多线程环境下会new出多个对象
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
比较常见的一种写法,采用加锁的双重校验方式,不过个人不是很喜欢这种写法,毕竟代码比较长
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
比较喜欢这种写法,和饿汉式比较类似,但通过类加载机制避免Singleton类初始化时加载这个单例,仅在需要的时候加载
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
这个比较爽,3行代码解决
public enum Singleton {
INSTANSE
}
使用javap -p Singleton.class命令显示所有类和成员可以看出枚举其实是饿汉式的一种
public final class test.Singleton extends java.lang.Enum<test.Singleton> {
public static final test.Singleton INSTANSE;
private static final test.Singleton[] ENUM$VALUES;
static {};
private test.Singleton(java.lang.String, int);
public static test.Singleton[] values();
public static test.Singleton valueOf(java.lang.String);
}
原文:https://www.cnblogs.com/lz-0011/p/11628482.html