即时加载
public class Singleton {
private static final Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
延时加载——双重检测枷锁
注意volatile关键字
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
延时加载——内部静态类
内部静态类在第一次被引用时加载,是线程安全的
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return Nested.uniqueInstance;
}
static class Nested {
private static final Singleton uniqueInstance = new Singleton();
}
}
单例模式序列化
注意实现readResolve方法,并且所用带有对象引用的实例域都必须声明为transient,详见《Effective Java》第77条。
import java.io.Serializable;
public class Singleton implements Serializable {
private static final Singleton uniqueInstance = new Singleton();
private transient String element = "singleton";
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
private Object readResolve() {
return uniqueInstance;
}
}
枚举类
单例的最佳实现方法,提供序列化机制,防止多次实例化,并且线程安全。
public enum Singleton {
INSTANCE;
// elements & methods
}