1.饿汉模式,
class Demo{
private static final Demo demo = new Demo();
private Demo(){
}
public static Demo instance(){
return demo;
}
}
2.懒汉模式
class Demo{
private static final Demo demo;
private Demo(){
}
public static Demo instance(){
if(demo == null){
synchronized(this){
if(demo == null){
demo = new Demo();
}
}
}
return demo;
}
}
这种模式可能存在问题
a>A、B线程同时进入了第一个if判断
b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
3.内部类
class Demo{
private Demo(){
}
private static class Sing(){
private static final Demo demo = new Demo();
}
public static Demo instance(){
return Sing.demo;
}
}
网友评论