- 饿汉模式:在加载类初始化的阶段进行创建。
- 饱汉模式:使用的时候才创建。
饿汉模式实现:
public class Singleton{//实现一 利用JVM对类的解析。
private Singleton(){}//构造函数私有化
private static Singleton instance=new Singleton();
public static Singleton getInstance(){return instance;}
}
public class Singleton{//实现二 利用静态内部类
private static class InnerSingleton{
private static Singleton instance=new Singleton();
}
private Singleton(){
if(InnerSingleton.instance!=null)//防止反射创建对象。
throw new RuntimeException("单例不能生成多个实例");
}
public static Singleton getInstance(){return InnerSingleton.instance;}
}
public enum Singleton{//实现三 利用枚举类型。枚举类型天然不允许反射创建。
INSTANCE;
public void print(){
System.out.println(this.hashCode());
}
}
public class Singleton{
private static class InnerSingleton{
private Singleton instance=new Singleton();
}
private Singleton(){
if(InnerSingleton.instance!=null)
throw new RuntimeException("单例不允许多个实例");
}
public static Singleton getInstance(){return InnerSingleton.instance;}
Object readResolve()throws ObjectStreamException{//用于反序列化时调用。
return InnerSingleton.instance;
}
}
饱汉模式:DoubleCheck
@ThreadSafe
public class Singleton{
private volatile static instance;//volatile 这里主要是防止指令重排。
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
//可能有多个线程阻塞在此。
synchronized(Singleton.class){
//因为可能有多个线程拿到锁,所以需要再加一层判断。
if(instance==null) instance=new Singleton();
}
}
return instance;
}
}
饱汉模式:延迟初始化占位类模式(最佳)
@ThreadSafe
public class Singleton{
private Singleton(){}
private static class InnerSingleton{
public static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return InnerSingleton.instance;
}
}