请教一个Singleton的问题?

我看到一段别人使用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的宗旨有所违背?

请指点.

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

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

还请各位指点.

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

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

是可以产生多个实例,但只有一个不是悬空的,其他的都注定要被垃圾回收。

不太理解楼上的,对象的引用已经返回给客户端,怎么断定只有一个不是悬空的呢?

在客户端不再引用这个对象以后,只有一个会保留下来

其实 Sigleton 不用来作多线程
多线程用Double-checked Locking