老关者,吾同学也。哈哈,今天看他的博客,对单态模式又有了进一步的理解。
以前使用的单态模式,也能实现,不过有个限制,看下面的代码
import java.util.*;
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton getInstance()
{
if (instance == null) //1
instance = new Singleton(); //2
return instance; //3
}
}
这就是我们常使用的单态模式。
现在,我们作一个假设,如果两个线程同时执行此程序,都刚执行完1,到2,还没有之行,停住。
此时
thread1得到的instance是null
thread2得到的instance也是null
下面会如何呢?
显然,两个线程会分别创建和初始化一个new Singleton()对象。
那么,我们的单态还能实现单态的功能吗?不能。
不过,这是个特例,只有在多线程程序,同时两个或多个线程都执行到1还没有执行2的时候才能出现。
也就是说,如果没有实现方法的同步的话,上面的模式是不能保证生成一个实例的。如果是在非多线程的程序中就更不会出现这样的问题。
但是,些程序是一个严密的工作。所以,程序要在任何情况和平台下都是正确的。
希望,通过此文,你也能明白,为什么上面的单态模式是不安全的,为什么这种实现方法有生成多个实例的可能?
想更深入的理解,请参考
http://guanhw.blog.hexun.com/10653016_d.html|----------------------------------------------------------------------------------------|
版权声明 版权所有 @zhyiwww
引用请注明来源 http://www.blogjava.net/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2008-02-15 13:27
zhyiwww 阅读(874)
评论(2) 编辑 收藏 所属分类:
j2ee