zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0
老关者,吾同学也。哈哈,今天看他的博客,对单态模式又有了进一步的理解。
以前使用的单态模式,也能实现,不过有个限制,看下面的代码
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 阅读(872) 评论(2)  编辑  收藏 所属分类: j2ee

FeedBack:
# re: 跟老关学单态模式
2008-02-15 16:44 | honeyjava
有必要用JCF中的类吗,不知道你那个vector干什么用的,很没意思。单例模式已经不能再成熟了,double-check式的已经被认为是线程不安全的。  回复  更多评论
  
# re: 跟老关学单态模式
2008-02-18 16:21 | zhyiwww
@honeyjava
现在是我修改后的代码。
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
}
}
当时就是摘抄的一段代码,只是为了能说明问题。
不过,听了您的说明,我对此模式有糊涂了。如果说上面的方法也是不安全的,那么哪一种方式是安全的呢?欢迎指导。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: