单例模式是创建型模式的一种,实现单例的类将构造方法私有化,对外提供唯一的实例。
饿汉模式
类被加载的时候即创建实例。因类加载是单线程的,故此方法是线程安全的。
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
懒汉模式
实例第一次被引用的时候才会被创建,需要考虑线程安全。
1. 双重校验锁。
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
//确保效率,避免频繁加锁
if(singleton == null) {
synchronized (Singleton.class) {
//确保线程安全,避免重复创建实例
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
2. 静态内部类。
内部类并不归属于外部类一起加载,内部类在被引用时才会被加载,即所谓懒汉。
如饿汉模式所述,类加载是线程安全的。
public class Singleton {
private static class SingletonCreator {
private static final Singleton singleton = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonCreator.singleton;
}
}
枚举模式
枚举从Java 1.5开始被引入,这是一种最简洁有效的单例实现途径。
枚举的特性确保了实例创建的线程安全,且避免实例反序列化时创建新的实例。
public enum Singleton{
INSTANCE;
public String otherField;
public void otherMethod() {
}
}