关于Singleton 的使用,是根据应用的需要来选择使用的方式,接下来,在必要同步的地方同步,不必要同步的地方不要同步,尽量减少死锁发生的机会,采取合理的使用方式来共享这些同步的数据资源,哪里会有什么问题。

死锁问题是同步的问题,不是Singleton 的问题

> 其实这篇文章作者不赞同Ioc模式称为dependency
> injection,依赖性注射的,并且说:If you're desperate
> to get a job at
> ThoughtWorks,看来gigix也是ThoughtWorks一个忠实的追随?
> 。

吾爱吾师,吾更爱真理。

在探讨Dependency Injection这个名字是否合适之前,我们需要先搞清楚IoC究竟是什么。IoC(Inversion of Control)是指:应用对象不控制框架,反过来由框架控制应用对象。它可以看作Template Method一种architectual的延伸。几乎任何一个常见的framework都实现了IoC,比如Struts,action不会去控制框架如何接收请求、如何转发到view,而是由framework来控制action的,决定什么时候调用action做什么事。所以IoC是framework的共性,如果没有IoC,那就是一个function library,而不是framework。既然这样,当我们说“PicoContainer是一个IoC的framework”,我们究竟说出了什么呢?那不就等于说“我的汽车是一辆有四个轮子的汽车”吗?Pico的不同之处在于,它的IoC是一种特殊的、专门针对对象创建的、解决dependency resolution问题的专用IoC。对于这种有专门目的和专门形式的IoC,难道我们不应该给它一个专门的名字以方便讨论吗?

你可以说我是Martin Fowler的忠实追随者,因为他给出的Dependency Injection这个名字相当贴切。如果你能给出一个更加贴切的名字,能让Rod Johnson和Jon Tirsen都表示认同,我不介意转做banq的忠实追随者。问题在于,你能么?

Singleton 是邪恶的 其实是翻译老外的英文,老外用这个词语旨在引起初学者注意,这个观点很早有了,我只是在一个适当时机引入过来,从中国人角度出发,我觉得“邪恶”两个字是极端的。老外根本没遭受文字狱啊。

> Singleton 是邪恶的
> 其实是翻译老外的英文,老外用这个词语旨在引起初学者注意
> 飧龉鄣愫茉缬辛耍抑皇窃谝桓鍪实笔被牍矗又泄
> 人角度出发,我觉得“邪恶”两个字是极端的。老外根本没遭
> 芪淖钟 ?>

哦,原来如此,我错怪banq了

to gigix
说话别那么火药嘛?什么“我能吗”,我是把你作为专业朋友和你探讨专业观点,我从来不要别人追随,我只想告诉他们:上帝和太阳早就死了(哇塞,这又是西方一句老话)。

>> Spring也在用Singlton啊!使用Spring就可以抛弃Singlton了吗?

订正:Spring没有使用Singleton模式。请参阅GoF,Singleton模式的特征是private的constructor和static的实例获取函数。在Spring中,你找不到符合这个特征的class。Spring虽然使用了“singleton=true”的配置,但那是提供全局唯一实例,而不是实现Singleton。也许Rod Johnson最大的错误就是不该为了使用者的熟悉而借用“singleton”这个词。

用这里斑竹的话来说,不要喊口号,请发表专业言论。我们都是在代码堆里摸爬滚打的人,不要仅仅凭猜想或者一点表面现象做判断。GoF的书就在你手边,Spring的代码就在你手边,为什么还做出“Spring也在用Singleton”这种不专业的判断呢?

> to gigix
> 说话别那么火药嘛?什么“我能吗”,我是把你作为专业朋友
> 湍闾教肿ㄒ倒鄣悖掖永床灰鹑俗匪妫抑幌敫嫠咚牵荷
> 帝和太阳早就死了(哇塞,这又是西方一句老话)。
>

康德说,世上有两件事让我们愈想就愈觉得敬畏:头顶的星空和心中的道德律。上帝或者已经死了,但真理在。只要是好的东西就不妨追随,所以别说是Martin Fowler和Thoughtworks的忠实追随者,我还是微软的忠实追随者呢。关键在于,谁都不要喊口号(例如“Singleton is evil”之类)。既然大家都是写过些Java代码的人,专业问题可以拿出技术细节来讨论。口号是喊给入门级选手(和尚未入门的选手)听的,我想既然jdon是专业论坛,应该可以跳过这个阶段才对。

另外,关于尼采那句话,在德国有个笑话。柏林墙上有人写了一句:“上帝死了――尼采”,隔天又有人在底下跟一句:“尼采才死了呢――上帝”。很多时候,我们根本没有资格讨论权威到底死了没死――或者你有资格,而我没有资格评论你。

我同意gigix:
也许Rod Johnson最大的错误就是不该为了使用者的熟悉而借用“singleton”这个词。

看得出gigix可能对我本人一些言论和态度是有意见的,我已经虚心接受,百花齐放应该是Jdon论坛的主题。

国内两大高手过招,本来偶们只有看的份的,不过偶还是忍不住插一句

讨论问题请注意问题约束,问题的context, 讨论问题不在同一个context下面进行是产生争论的根本。浪费口水

老天,俺的Singleton!
俺的ServiceLocator就是Singleton,虽然简单,但却是几个J2EE项目的基础模块!各位老大先别吵架,告诉俺该怎么办呀!
俺其他的Singleton都是只读的,估计不会出现死锁之类的问题,可是这个ServiceLocator???!!!

楼上各位高手过招有点意思,我这有个问题,希望大家帮助解决一下.
用对象池能解决问题,不能用单实例到解决吗?前提是不需要同步.实例的成员变量是无状的,只读的(系统加载时已初始化了,因为是单实例所以就只初始化一次了). 如有各位有空给个原理说明一下,小弟倍数感谢.

> >>
> Spring也在用Singlton啊!使用Spring就可以抛弃Singlton了
> 穑?>
> 订正:Spring没有使用Singleton模式。请参阅GoF,Singleto
> 模式的特征是private的constructor和static的实例获取函数
> TSpring中,你找不到符合这个特征的class。Spring虽然使
> 昧恕singleton=true”的配置,但那是提供全局唯一实例
> /b],而不是实现Singleton。也许Rod
> Johnson最大的错误就是不该为了使用者的熟悉而借用“singl
> ton”这个词。
哈哈,言辞这么激烈。好,我一条条的回答你。
1。Singleton的本质是提供单一的实例。至于private的constructor和static的实例获取函数只是一般的实现方式,像你这样的高手,不会这么教条吧?实际上你已经帮我回答了:“但那是提供全局唯一实例”。
2。用public的构造器就不能实现Singleton吗?只不过一般不这么做了。

> 用这里斑竹的话来说,不要喊口号,请发表专业言论。我们都是在代码>堆里摸爬滚打的人,不要仅仅凭猜想或者一点表面现象做判断。GoF的书>就在你手边,Spring的代码就在你手边,为什么还做出“Spring也在用>Singleton”这种不专业的判断呢?
3。都喜欢那专业来压人,我先申明,我一点都不专业。我从来没用过Spring。看到你说这样的话,我倒是翻出Spring的源代码,用关键词Singleton搜索文件名。呵呵,一下就找到了3个这样命名的类:
org.springframework.beans.factory.access.SingletonBeanFactoryLocator
org.springframework.context.access.ContextSingletonBeanFactoryLocator
org.springframework.aop.target.SingletonTargetSource
第一第二个都满足你说的条件。我想你应该纠正你的话了。

其实我几乎没见过开源项目不用Singleton和Factory的。这两个是最常用的啊。我眼光太短浅了! 实在惭愧!

>也许Rod Johnson最大的错误就是不该为了使用者的熟悉而借用“singleton”这个词。

真不知道你们怎么会得出这样的一个结论。我真看不出来Singleton会是向你们说的那样烂,那样的难学,那么多的问题。人家只是提供一个单一实例而已,不用Singleton,你们用什么实现单一的实例?高手们能不能和我讲一讲,让我也长长见识?或者你们不屑于用Singleton,那么告诉我一个更好的办法?谢了先!

> > >>
> >
> Spring也在用Singlton啊!使用Spring就可以抛弃Singlton了
>
> > 穑?>
> >
> 订正:Spring没有使用Singleton模式。请参阅GoF,Singleto
>
> >
> 模式的特征是private的constructor和static的实例获取函数
>
> >
> TSpring中,你找不到符合这个特征的class。Spring虽然使
>
> >
> 昧恕singleton=true”的配置,但那是提供全局唯一实例
>
> > /b],而不是实现Singleton。也许Rod
> >
> Johnson最大的错误就是不该为了使用者的熟悉而借用“singl
>
> > ton”这个词。
> 哈哈,言辞这么激烈。好,我一条条的回答你。
> 1。Singleton的本质是提供单一的实例。至于private的const
> uctor和static的实例获取函数只是一般的实现方式,像你这?> 的高手,不会这么教条吧?实际上你已经帮我回答了:“但那
> 翘峁全局唯一实例”。
> 2。用public的构造器就不能实现Singleton吗?只不过一般不
> 饷醋隽恕?>
> >
> 用这里斑竹的话来说,不要喊口号,请发表专业言论。我们都
> 窃诖?堆里摸爬滚打的人,不要仅仅凭猜想或者一点表面现
> 笞雠卸稀GoF的书>就在你手边,Spring的代码就在你手边,?> 什么还做出“Spring也在用>Singleton”这种不专业的判断呢
> ?> 3。都喜欢那专业来压人,我先申明,我一点都不专业。我从?> 没用过Spring。看到你说这样的话,我倒是翻出Spring的源代
> 耄霉丶Singleton搜索文件名。呵呵,一下就找到了3个?> 样命名的类:
> org.springframework.beans.factory.access.SingletonBean
> actoryLocator
> org.springframework.context.access.ContextSingletonBea
> FactoryLocator
> org.springframework.aop.target.SingletonTargetSource
> 第一第二个都满足你说的条件。我想你应该纠正你的话了。
>
> 其实我几乎没见过开源项目不用Singleton和Factory的。这两
> 鍪亲畛S玫陌 N已酃馓糖沉耍?实在惭愧!

基本同意你的观点,只是稍补充一下:
>2。用public的构造器就不能实现Singleton吗?只不过。

“一般不这么做了”的原因是:这里使用private可以更保险单一实例

楼上各位在讨论问题时,请从问题角度出发.讨论单实例的原理,什么时候用,什么时候不用.不要针对人和物好吗?.
我个人认为单实例的存在,有他的必要性,如果这个单实例是线程安全或是只读的,无状态这完全没问题.
请高手指点