双重检查代码下:
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance;
}
为什么不写成这样:
public static Singleton getInstance()
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
return instance;
}
求大神赐教?
前者比后者效率高。。
前者只有instance=null时才会去持有锁。
后者每次都会加锁,所以效率偏低。
但是前者有时候会出现问题,原因是jvm的内存分配模型(出问题的机会超级小,因为首次初始化就出现并发,并且
内存分配还没完成,并发线程就使用的这个概率太低)。
你可以多了解了解。
如果有帮助,希望结帖
这两段代码都是错的,并且第一段代码错的更严重。
http://blog.csdn.net/yaerfeng/article/details/7762616
设计为单例模式,表明类是状态无关的,那么就说明不需要使用同步,
使用了同步,则不能设计为单例模式。
锁匙一种比较耗性能的操作,第一种是判断一下如果单列对象没有创建就创建一个对象,但怕在创建对象的同时其他线程也在运行这段代码,此时就会造成生成多个对象的后果,就不再是单列了,所以要锁起来,但此时如果单列对象存在,就不会执行锁里面的内容,提高效率。相反,如果在if处就放锁,这样的后果是每次都会建锁,这是比较耗性能的
因为他会把synchronized修饰的部分整个锁定,其他过来的请求都要等待上一个请求释放锁,其他请求才能去争抢那把钥匙。可以看看reentrantlock