bq看看这个,既然可以这样为什么还要用dcl

public class Resource
{
private static final Resource instance = new Resource();

private Resource() {}

public static Resource getResource()
{
return instance;
}
}

这样不是可以避免DCL带来的多线程编程的麻烦以及你所提到的错误吗?

再看看banq的单态,以经说明了这个问题!
dcl真是鸡肋啊!!!
http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=982

你这样不是失去了"懒惰初始化"的好处了吗?

你这个例子只是说明,实际线程使用中,会出现更复杂的DCL现象,导致系统在庞大用户同时在线时,系统运行混乱。

我来帮忙UP,这个问题我还是有点疑惑,看了DCL那么麻烦,而且在想要性能的时候有漏洞,想要安全的时候性能又不高,凭我现在的水平还看不出来像楼主这样和DCL比起来有什么不好的,当然,"懒惰初始化"是放弃了,但我们先忽略不记这个。其实我发现对这个问题不是很清楚的网友(当然包括我)不少的,BANG,看了你的回复,我觉得太笼统了,不是很详细,不可否认,本人水平也实在(连我自己都)不敢恭维,无法明白BANG你回复的具体意思:

“实际线程使用中,会出现更复杂的DCL现象,导致系统在庞大用户同时在线时,系统运行混乱。”

麻烦BANG在有空的时候就楼主的主题和你的这个回复详细的说明一下,为什么会这样,会发生你说的情况?希望我自己和没弄清楚的朋友得到提高,代表大家谢谢你。

知道banq下面还有话说的!
搬登子听课!呵呵!

我想,大概是因为这个问题太简单而幼稚,所以BANG和众高手们都不削回答,不过,我对这个帖子等了好几天了,很辛苦,请大家本着扶贫的精神回答:

“实际线程使用中,会出现更复杂的DCL现象,导致系统在庞大用户同时在线时,系统运行混乱。”

为什么用楼主的方法会造成这样的结局,如果可能,请用例子来说明。

我想BANG做这个网站的目的是想帮助访问她的所有人提高水平,不会只针对那些少数的(当然不一定)水平很高的人,我来这里的时间不长,但自己感觉已经得到了不少帮助,很喜欢这里,但提高需要时间,任何人都有个过程,请对我这个水平很一般得人有点耐心,我会经常来这里学习的!

祝每个来这里的人有所得!

对不起,这样的例子举起来代码会很长,说明会很多.
你可以参看javaworld上的相关文章

我找过一些资料来看,确实会有一些不可预知的可能性存在。
那就证明,DCL 不是一个好的方法,不用它就是了。

对不起,什么是DCL???

dcl = Double-checked locking

如下:

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 好处。

因为有的时候必须lazy-load!

可以这样吗?
class Singleton
{
private static Singleton instance = null;
//enforce singleton
private Singleton() {
//...
}
public static Singleton getInstance()
{
if(instance == null){
synchronized(Singleton.class){
//check again
if(instance ==null ){
instance = new Singleton();
}
}
}
return instance;
}
}

不知道这样对性能的影响会有多大?一旦instance实例化后,第二次getInstance()就不会再运行到 synchronized(..)。为什么非要在方法上进行整个同步呢?这样做会产生多个Singleton的实例吗?
[该贴被whyenglish于2009-07-01 13:51修改过]