即时加载
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 }
原文:http://blog.csdn.net/perfect8886/article/details/39394101