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

03-01-09 hxz
public class Resource

{

private static final Resource instance = new Resource();

private Resource() {}

public static Resource getResource()

{

return instance;

}

}

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

hxz
2003-01-09 10:09
再看看banq的单态,以经说明了这个问题!

dcl真是鸡肋啊!!!

http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=982

jxb8901
2003-01-09 18:08
你这样不是失去了"懒惰初始化"的好处了吗?

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

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

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

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

hxz
2003-01-10 11:17
知道banq下面还有话说的!

搬登子听课!呵呵!

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

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

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

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

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

banq
2003-01-14 10:08
对不起,这样的例子举起来代码会很长,说明会很多.

你可以参看javaworld上的相关文章

iceant
2003-01-14 23:39
我找过一些资料来看,确实会有一些不可预知的可能性存在。

那就证明,DCL 不是一个好的方法,不用它就是了。

richardluopeng
2003-01-23 13:44
对不起,什么是DCL???

manbaum
2003-03-24 17:12
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 好处。

shyguy
2003-04-11 13:49
因为有的时候必须lazy-load!

whyenglish
2009-07-01 13:49
可以这样吗?

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修改过]

猜你喜欢