JAVA 单例模式的靠谱写法
简介
单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个对象实例。
写法1(静态常量)
写法简单,但没有懒加载,可能会资源浪费。
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
或者:
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
写法2(Double-Check)
线程安全;延迟加载;效率较高。
public class Singleton {
private static Singleton singleton;
//关闭默认构造方法,禁止new对象
private Singleton() {}
//仅能通过此方法获取Singleton实例
public static Singleton getInstance() {
if (singleton == null) { //一次检查
synchronized (this) { //添加同步块,防止多线程初始化singleton
if (singleton == null) { //二次检查,防止后续排队任务再次初始化
singleton = new Singleton();
}
}
}
return singleton;
}
}
写法3(内部静态类)
1、静态内部类在外部类被装载时并不会立即实例化,而是在被调用时才会被加载。
2、类的静态属性只会在第一次加载类的时候初始化,JVM保证了线程的安全性。
线程安全,延迟加载,效率高。
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
推荐后两种写法。