一、静态内部类的实现
当调用getInstance时,内部类被实例化,由于类变量被static修饰,导致变量成为类变量,为类所共有(只存在一个),保证了线程安全
public class StaticSingle {
private static class SingleClassLoader{
public static StaticSingle single=new StaticSingle();
}
public static StaticSingle getInstance(){
return SingleClassLoader.single;
}
}
这样写会存在一定的问题,存在什么问题呢?
- 使用反射机制将构造函数改为public就会破坏单例
- 序列化会破坏单例,因为在反序列的过程中jvm会自动调用readResolve来通过反射获取一个新的实例,这样就破坏的单例
解决办法:
逻辑判断是否被实例,实例了就要抛出异常终止创建过程
private static boolean instance=false;
private StaticSingle(){
synchronized (StaticSingle.class){
if(instance==false){
instance=true;
}else{
throw new RuntimeException("error");
}
}
}
重写readResolve方法
public Object readResolve(){
return SingleClassLoader.single;
}