本人觉得板主对SPRING有偏激的看法,本人在项目中正好在使用SPRING,其实由于SPRING的使用,大大提高了开发和测试效率.关于THREAD SAFE问题,我觉得SERVLET是一个很好的例子.正因为SERVLET是一个SINGLE INSTANCE ,所以其实际运行效率很高.
在使用SERVLET的过程 中,所有INSTANCE VARIABLE不是TRHEAD SAFE的,换言之,在实际应用中,应避开使用INSTANCE VARIABLE. 用SPRING 是一个道理,所有BIZ TIE的COMPOMNENT.都是一个SERVICE,在RUNTIME时应该是一个INSTANCE,MULTI THREAD, 而且不用INSTANCE VARIABLE,这样运行效率其实比INSTANCE POOL要快.

由于所有DEPENDENCY都来由SPRING来WIRE.代码非常干净.

另外对于每个METHOD,我实想不通,板主为什么要SYNCHRONIZE ? 难道这样做就能保证同时只有一个用户执行这个METHOD? 在CLUSTER的情况下,是没有任何意义的.另外我要说明的是SINGLETON并不是SINGLE INSTANCE,SINGLETON是指在一个WORKSPACE中的SINGLE INSTANCE,这个WORKSPACE可以是一个JVM,也可以同时多个JVM. 如果想限定该METHOD一次只允许一个用户访问的话,应该在一个CENTRAL RESOURCE(如DATABASE)使用SEMPHORE机制.

另外EJB和SPRING并没有任何对立的地方.反而两个配合使用,双方更可取长补短.
在实际EJB开发过程中,EJB(SESSION STATELESS BEAN)应该作为一个WRAPPER出现, 而所有的BIZ LOGIC COMPONENT 都应该做成pojo,这样做,一来便于测试,二来它是一个通用的POJO.可以通过各种WRAPPER,将其包装成你需要的东西,通过EJB的包装,POJO就摇身一变成为EJB.如果它被WEBSERVICE包装,它就变成 了WEBSERVICE.
在一个项目中,可以只要一个SESSION BEAN.而且是通用的,其它的就是POJO.

相反SPRING作为一个ORGANIZER出现,它负责各种不同的COMPONENT组关起来.加上不同的DECORATOR 如INTERCEPTOR,TRANSACTION等.

g迎大家共同!

今天看了一下程序员第10期 banq 对SPRING的言论, 与看过前几期 banq 对Hibernate 发表的言论后的感觉一样, 确实觉得banq 的看法太过偏激.
总是从反面去评价这些新生事物,有着极浓烈的个人感情,却不知道你文章中真正想表达的是什么. 希望你能秉持传道解惑的初衷, 不要误导广大对你充分信任的初学者为宜.

从我这段时间在项目中使用 Spring,hibernate的感受来说,起码他们给我带来了设计思路及编程习惯的改变,我想这是很重要的:
运用Spring的架构会帮助你对项目(可不仅仅是WEB项目哦)的层次分析的更为透彻,职责划分的更为明确;
降低了代码的开发及维护成本;
培养起接口-->测试-->代码实现的编程习惯.

zrq和gigix两位在多线程概念上都有一些误区,当然如果你们觉得自己正确就好,我也不好写那么长言论,相当于把Jdon讨论的帖子都翻过来。

关于是否Spring配置时需要考虑是否使用Singleton,这个错用现象是我在一个项目咨询中发现的,这涉及到类变量和共享等问题。

这个帖子留在这里吧,多年以后再回头看看或许每个人都有自己的收获。


> zrq和gigix两位在多线程概念上都有一些误区,当然如果你们
> 醯米约赫肪秃茫乙膊缓眯茨敲闯ぱ月郏嗟庇诎Jdon讨?
> 的帖子都翻过来。
>
> 关于是否Spring配置时需要考虑是否使用Singleton,这个错?
> 现象是我在一个项目咨询中发现的,这涉及到类变量和共享等
> 侍狻?
>
> 这个帖子留在这里吧,多年以后再回头看看或许每个人都有自
> 旱氖栈瘛?
>
>

我也不需要什么长篇大论,我只请高手看一段小代码:

public MyClass implements Runnable {
private static MyClass _instance;
public MyClass getInstance() {
return _instance;
}
public void run() {
while(true) {
Thread.sleep(1000);
}
}

public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
new Thread(MyClass.getInstance()).start();
}
}
}

请问,上面这段代码,有没有你所说的“Singleton的性能问题”?如果有,请说明具体是什么;如果没有,请说明这段代码与Spring里面Singleton的业务对象有何不同,为何后者就会有性能问题。我想这不是一个很费劲的问题,而且大家都能看懂,希望高手能解释一下。

前一篇回复,代码第二行应该是:


// eager create instance
private MyClass _instance = new MyClass();

盼望回复。

请gigix不要着急,多线程性能请到下面这个版块讨论:
http://www.jdon.com/jive/forum.jsp?forum=121

讨论之前,可先仔细查看以前的帖子,你这个简单的程序是没有问题的,关键你要引入共享的类变量,或者有写数据库等资源操作的方法。

>> 你这个简单的程序是没有问题的,关键你要引入共享的类变量,或者有写数据库等资源操作的方法

我请问你,好端端一个业务对象,你为什么要“引入共享的类变量”?大家都在提倡stateless、immutable的对象,为什么,就是因为它是thread unaware的。J2EE应用里面,业务数据的状态有persistent object,用户的状态有session,为什么还要把中间的业务对象搞成有状态?这不是自找麻烦吗?

我再请问你,写数据库这样的操作,靠Java代码synchronize能保证线程安全?你写到一半我直接到数据库里把记录删了,你能怎么办?如果资源操作的线程安全性还要靠Java业务代码来保证,我们要JTA、JTS来干什么的?

只要你能赞同说“这个简单的程序没问题”,也就好了,为什么,因为你再也举不出一个例子比它更复杂。如果有谁不信,可以来试试:举出一个J2EE典型应用中有必要自主维护线程安全性的业务对象例子。这就当我给各位高手们的挑战了。

gigix 我都看不懂你说的话,我真惭愧。也请你不要用那么多反问句,好像来吵架的,请冷静下来,谢谢,请遵守Jdon论坛规则。

我的问题非常简单:

1、请问,对无状态、无synchronized关键字的business object使用singleton模式有没有性能问题?

2、假设对有状态、有synchronized关键字的business object使用singleton模式存在性能问题,请举出一个需要使用这种对象的需求实例。

假如问题1的答案是“没有”,并且又找不到一个实例说明需要问题2的那种对象,那么整个事情就非常清楚了:你所说的“Spring采用Singleton模式处理业务对象造成的性能问题”纯属子虚乌有。现在请回答这两个问题吧。

其实你的问题还是基于以前的技术基础和思路,我想无论我怎么回答你都不会满意(不知你明白我的意思没有,不过你勇气可嘉),真的建议你自己做个例子调试,我为什么要花那么多时间和精力向你证明我的经验常识啊,当然,你可以认为我拿不出实例来证明,:)

Singleton有性能陷井是我的经验常识,你可能只相信E文文章,也确实现在没有一篇专门的E文说这个问题的,我好歹找了一篇Javaworld上的Singleton专题,Singleton模式好像很简单,但是其实是最复杂的模式,这篇文章第四点谈到多线程,供你参考,你也可以使用Optimizeit测试你程序死锁等现象:
http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html
http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java
http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java
当你了解了Singleton有这么多陷井你还会象以前那样大无畏的使用它吗?当你了解越多,你就应该越加谨慎和谦虚。

这是Spring帖子,我还是和Spring结合回答你的两个问题吧,其实你的问题有些奇怪,好像是1+2+A+B,我就照我的理解意思回答你的两个问题,从字面上看,你的问题只概括了两种情况,还有无状态、有synchronized和有状态、无synchronized两种情况。

你的第一种情况,理论答案是没有,但是实践中我不会这么做,因为business object是一个复杂的对象,我无法保证它其中调用的子类或扩充的子类会不会有synchronized。所以,我会使用Spring的Pool拦截器用对象池来实现这些business object,Spring如下配置:


<bean id="poolTargetSource"
class=
"org.springframework.aop.target.CommonsPoolTargetSource">
<property name=
"targetBeanName"><value>petshopServiceTarget</value></property>
<property name=
"maxSize"><value>25</value></property>
</bean>

<bean id=
"businessObject"
class=
"org.springframework.aop.framework.ProxyFactoryBean">
<property name=
"targetSource"><ref local="poolTargetSource"/></property>
</bean>

第二种情况,前面已经回答,当然你可以认为我拿不出实例,但是我还是奉劝和你一样勇气可嘉的程序员,仔细理解Singleton的使用误区,使用Spring时,仔细考虑是否到底需要使用Singleton,能不用尽量不用。这也是经验之谈,有时我觉得告诉别人经验之谈真是一件很累人的事情,好像我一定要让你相信,我的观点:爱信不信。

最后,再次请求你,如果你在研究java多线程性能中问题,请到专门版块讨论,这个帖子是讨论Spring的。

好的,我终于看到一个明确的答复了。现在我将继续探讨这个“Singleton的性能问题”,请各位高手随我移驾到“Java多线程性能”板块,我们看看究竟是哪些人不谦虚不谨慎。let's go。

另启:既然banq坚持说是“经验之谈”,想来是有很多实际的例子作为支撑。我要的仅仅是“一个例子”而已。如果说我要你举例证明“50%的J2EE应用需要用到有状态有synchronized的业务对象”,那是我胡搅蛮缠,因为你不可能有时间和精力举那么多例子,也不可能做那么多统计。但我要的仅仅是一个例子,只要你能举出一个需要这种业务对象的例子,就足以证伪我的理论,难道举出一个例子也需要“花那么多时间和精力”吗?这是不是说明,找到这样的一个例子并不是那么容易?这是不是说明,这种情形其实并不常见呢?作为一个经验丰富的J2EE架构师,如果你要我举一个常识性的例子,我可是能够信手拈来的哦。

jdon说的是有道理的,singleton的使用尽量限制在较为简单的情况,否则被多线程使用会出现恶劣的性能现象。但再不涉及到复杂的情况下使用singleton还是挺好的,gigix举的例子正好是这种简单情况