懒汉模式
特点:延迟加载,等需要用到的时候再实例化(不能防止别人运用反射的方法破坏单例的设计)
常规实现如下:
public class LazySingleton implements Serializable{
//私有实例
// volatile 防止java指令重排
private volatile static LazySingleton shareInstance;
//私有构造函数
private LazySingleton{
}
//公开的获取实例方法
public static getShareInstance(){
if(shareInstance == null){
synchronized(LazySingleton.class){
if(shareInstance == null){
shareInstance = new LazySingleton();
}
}
}
return shareInstance;
}
//添加此方法阻止序列化时重新生成对象
private Object readResolve(){
return doubleLock;
}
}
使用静态内部类实现如下:
特点:看起来像饿汉模式,实际上是懒汉模式,因为静态类部类ShareInstanceHolder是在被调用的时候才开始加载的,而且利用java的类加载机制保证了线程安全
public class InnerClassSingleton{
//私有的静态内部类
private static class ShareInstanceHolder{
public static InnerClassSingleton shareInstance = new InnerClassSingleton();
}
private InnerClassSingleton{
//防止别人运用反射破坏单例模式
if(ShareInstanceHolder.shareInstance != null){
throw new RuntimeException("实例已存在");
}
}
public static getShareInstance(){
return ShareInstanceHolder.shareInstance;
}
}
饿汉模式
特点:类加载时直接实例化
public class HungrySingleton{
private static HungrySingleton shareInstance = new HungrySingleton();
private HungrySingleton{
}
public HungrySingleton getShareInstance(){
return shareInstance;
}
}