{
private static final Resource instance = new Resource();
private Resource() {}
public static Resource getResource()
{
return instance;
}
}
这样不是可以避免DCL带来的多线程编程的麻烦以及你所提到的错误吗?
private Resource() {}
public static Resource getResource()
{
return instance;
}
}
这样不是可以避免DCL带来的多线程编程的麻烦以及你所提到的错误吗?
“实际线程使用中,会出现更复杂的DCL现象,导致系统在庞大用户同时在线时,系统运行混乱。”
麻烦BANG在有空的时候就楼主的主题和你的这个回复详细的说明一下,为什么会这样,会发生你说的情况?希望我自己和没弄清楚的朋友得到提高,代表大家谢谢你。
“实际线程使用中,会出现更复杂的DCL现象,导致系统在庞大用户同时在线时,系统运行混乱。”
为什么用楼主的方法会造成这样的结局,如果可能,请用例子来说明。
我想BANG做这个网站的目的是想帮助访问她的所有人提高水平,不会只针对那些少数的(当然不一定)水平很高的人,我来这里的时间不长,但自己感觉已经得到了不少帮助,很喜欢这里,但提高需要时间,任何人都有个过程,请对我这个水平很一般得人有点耐心,我会经常来这里学习的!
祝每个来这里的人有所得!
如下:
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
Singleton inst = instance; //2
if (inst == null)
{
synchronized(Singleton.class) { //3
//inst = new Singleton(); //4
instance = new Singleton();
}
//instance = inst; //5
}
}
}
return instance;
}
我觉得没必要 dcl,两次 synchronized 难道不花费更多的时间么?本来为了提高性能,反而把问题复杂化了。
class Singleton
{
private static Singleton instance;
private Vector v;
private boolean inUse;
private Singleton()
{
v = new Vector();
v.addElement(new Object());
inUse = true;
}
public static synchronized Singleton getInstance()
{
if (instance == null) //1
instance = new Singleton(); //2
return instance; //3
}
}
这样不会影响多少性能,不就是等待一个 return 的时间么。
class Singleton
{
private Vector v;
private boolean inUse;
private static Singleton instance = new Singleton();
private Singleton()
{
v = new Vector();
inUse = true;
//...
}
public static Singleton getInstance()
{
return instance;
}
}
也可以,不用等,只是没有了 lazy initialize 好处。
不知道这样对性能的影响会有多大?一旦instance实例化后,第二次getInstance()就不会再运行到 synchronized(..)。为什么非要在方法上进行整个同步呢?这样做会产生多个Singleton的实例吗?
[该贴被whyenglish于2009-07-01 13:51修改过]