定义
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
实现
以下是常见的五种实现方式:
饿汉模式/立即加载
线程安全,调用效率高,但是不能延迟加载。
public class Singleton1 {
private static Singleton1 instance = new Singleton1();
private Singleton1() {
}
public static Singleton1 getInstance() {
return instance;
}
}
懒汉模式/延迟加载
可以延迟加载,但是存在线程安全问题,为了避免则在方法前使用synchronized关键字,效率降低很多。
public class Singleton2 {
private static Singleton2 instance;
private Singleton2() {
}
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
双锁检测DCL(Double-Check Locking)
双锁检测,注意使用volatile和类锁Singleton3.class,通常是线程安全的,但由于JVM底层问题有小几率出问题。
public class Singleton3 {
private static volatile Singleton3 instance;
private Singleton3() {
}
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
静态内部类
线程安全,调用效率高,可以延迟加载
public class Singleton4 {
private static class Singleton4ClassInstance {
private static Singleton4 instance = new Singleton4();
}
private Singleton4() {
}
public static Singleton4 getInstance() {
return Singleton4ClassInstance.instance;
}
}
枚举
线程安全,调用效率高,可以防止反射和反序列化调用,代码十分简洁。
public enum Singleton5 {
INSTANCE;
public void methods(){
//doSometing;
//想要获取单例就直接在main里调用Singleton5.INSTANCE.methods();
}
}