关于单态模式的问题

02-12-26 fuzhou
在阎宏的java与模式中,他讲到双重成例检查在大多数情况下是不能在java环境下成立的,不是很明白,看斑竹的代码中好象就用了这个东西

那么这个到底能不能行那?

hxz
2002-12-26 15:51
为什么banq不回这帖子?是不是提到阎宏博士,心里狠狠的!

开玩笑:)

banq
2002-12-26 15:56
:) 不过,看了这位博士的书的目录,除了GOF的23个设计模式我看得懂外,其它我真的掉入云里雾里。

可能我用了"双重成例检查",但是我不知道它叫"双重成例检查",你能告诉我吗?

一般在国外市面上公认三套设计模式的名称 GOF98、Grand99 还有一个名字忘记了,是关于并行模式的。

我们自己都可以发明自己命名设计模式,但是能否得到公认,另当别认。

fuzhou
2002-12-26 15:58
我觉得应该是高手惺惺相吸才对吧,都到了这种境界了,想不出有什么理由好狠狠的????

fuzhou
2002-12-26 15:59
就是这个

if (factory == null) {

      synchronized(initLock) {

        if (factory == null) {

          try {

            Class c = Class.forName(className);

            factory= (AuthorizationIF)c.newInstance();

          }catch (Exception e) {

            throw new Exception("Exception loading AuthorizationIF

             class: " +className + e);

          }

        }

      }

    }

hxz
2002-12-26 16:04
事实上提到过啊!

不就是double-checked locking

fuzhou
2002-12-26 16:09
对哦对哦,阎宏同志说类的初始化和变量的初始化的顺序不可预料,因此

如果在别的地方引用到该实例后后果不可预料,还是对方法同步最安全。

说真的,我也搞不清楚double check lock到底有多大的好处,是对方法的同步开销太大吗???

hxz
2002-12-26 16:14
上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。

注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,有兴趣者进一步研究。

一般认为第一种形式要更加安全些。

引用至:首页的工厂方法

为什么第一安全些而第二种被jive采用?

是不是第二种在不设及ejb和分布式多jvm时也是安全的?

banq
2002-12-26 17:35
DCL是有一些好处,主要是不必每次重新生成对象。网上有很多关于DCL的讨论,这里面学问很大,钻进去,发现有一堆理论,我是头疼了。

corejava
2002-12-26 20:47
晕,一连看了好几天,云里雾里,好几十种模式,现在的工程用的却不多,也就那么几种,不过还是为中国的文化底蕴惊叹.

猜你喜欢