双锁检查通常写为:Singleton设计模式
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance; //4
}
在上面的代码中,假设10个线程调用这个方法,所有的人都越过了第一个if条件,那么一个线程进入同步块并创建实例。即使创建了实例,剩余的9个线程也会一个接一个地等待,并通过synchronized块顺序进入。我希望一旦任何线程创建Singleton实例,所有其他线程都不应该等待。告诉我是否有解决方案?
Bill Pugh是你的英雄:http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh – eSniff 2011-12-22 06:03:16
@Mitch:那篇文章已经9岁了。双重检查锁定可以在任何非古董虚拟机中安全工作;但它不是实例化单例的最佳方式。 – 2011-12-22 06:11:53
@Mitch:啊!这太糟糕了,只要你知道它今天不是直接适用的,它仍然是一个很好的和信息丰富的阅读。这里又是:http://www.ibm.com/developerworks/java/library/j-dcl/index.html。随后讨论了在新内存模型下安全双重检查锁定的缺点:http://www.ibm.com/developerworks/library/j-jtp03304/#3.2 – 2011-12-22 06:22:59