请教一个Singleton的问题?

03-10-29 nitmithv
我看到一段别人使用Singleton的代码.

public class MainDataSource

{

private static MainDataSource singleton;

public static MainDataSource getInstance()

{

if (singleton == null)

{

singleton = new MainDataSource();

ocdbm = new OracleConnDBMrgr();

ocdbm.setLoacation(JobProperty.JOBORACLEDS);

}

return singleton;

}

}

在这个Singleton中,没有用到synchronized,可能会产生多个单实例,这样是不是跟Singleton的宗旨有所违背?

请指点.

banq
2003-10-29 11:35
严格来说应该加上synchronized,但是一般项目访问密集度没有那么高,所以有的开发者就忽略了,也是可行的。

nitmithv
2003-10-29 20:52
可是下午我问一同事的时候,他说这样就是允许产生多实例,生成一个实例缓冲池.我觉得这样挺纳闷的,如果这样做的话,就没必要用单实例了.

还请各位指点.

Swallor
2003-10-31 10:59
我不同意banq的想法,一般的应用更应同步!当确实影响性能的时候才考虑用对象缓冲池。

chinahero
2003-11-23 20:04
如果不加同步关键字,如果线程刚好在==null时切换,会产生多个实例,但是我想由于即使用产生多个实例,也不会影响系统运行结果,和银行存取钱的那个例子不一样,没有需要互斥的操作,所以这段代码运行中,有多个实例,但不是太多,也就是所以的对象池,不知道我的想法对不对

wwlhp@jdon.com
2003-11-24 11:48
是可以产生多个实例,但只有一个不是悬空的,其他的都注定要被垃圾回收。

月满西楼
2003-11-26 13:28
不太理解楼上的,对象的引用已经返回给客户端,怎么断定只有一个不是悬空的呢?

coolj
2003-11-28 14:16
在客户端不再引用这个对象以后,只有一个会保留下来

Lada314
2005-03-20 01:10
其实 Sigleton 不用来作多线程

多线程用Double-checked Locking

猜你喜欢