1.饥汉模式
public class Singleton{
//饥汉模式: 创建私有静态化实例,在类初次加载时即初始化
private static final Singleton instance = new Singleton();
//将Singleton()构造方法级别置为private
private Singleton(){};
//公有静态方法,获取单例实例
public static Singleton getInstance(){
return instance;
}
}
2.饱汉模式(双重检查)
public class Singleton{
//饱汉模式:在类初次加载时不进行实例初始化,当需要使用实例时初始化(volatile为必须)
private static volatile Singleton instance = null;
//将Singleton()构造方法级别置为private
private Singleton(){};
//双重检查,当实例instance为null时,初始化该实例
public static Singleton getInstance(){
if( instance == null ){
//加锁
synchronized(Singleton.class){
if( instance == null ){
instance = new Singleton();
}
}
}
return instance;
}
}
3.静态嵌套类(推荐)
public class Singleton{
//将Singleton()构造方法级别置为private
private Singleton(){};
//静态嵌套类内部初始化实例
private static class SingletonInstance{
private static final Singleton instance = new Singleton();
}
//获取实例方法
public static Singleton getInstance(){
return SingletonInstance.instance;
}
}
注:
在上2例,如果不使用volatile关键字,则在多线程情况下,由于JMM(Java内存模型)的原因,可能导致非单例情况,利用volatile的可见性可解决该问题(JDK1.5及之后).
枚举类很特殊,在类加载的时候会初始化所有实例,且不会再次被实例化(由JVM保证),也可以实现单例(不推荐使用).
静态嵌套类与内部类不同.