> 在静态方法内部只要没有用到静态成员变量的话,就不会有多
> 叱痰奈侍猓singleton也是如此,banq说的情况估计是设
> 剖蟆static方法一般用于设计一些通用的Helper类,以节?> 内存,提高速度,不适宜放在有业务意义的类里面,因为会让
> 司醯酶嫦蚨韵蟮脑碛兴ケ常绻朔奖悴幌胗Hel
> er类而直接写在业务类里也是无可厚非的。

我非常同意你的观点,我在实现一个绝对是超多线程,实时要求性非常高的调度系统时,大量使用静态方法,目的只有一个-》速度。事实证明效果非常好。
其实,静态函数,新建对象,等个有个的适用范围,充分了解它们,扬长避短才是道

> >
> 在静态方法内部只要没有用到静态成员变量的话,就不会有多
>
> >
> 叱痰奈侍猓singleton也是如此,banq说的情况估计是设
>
> >
> 剖蟆static方法一般用于设计一些通用的Helper类,以节?
> 内存,提高速度,不适宜放在有业务意义的类里面,因为会?>
> >
> 司醯酶嫦蚨韵蟮脑碛兴ケ常绻朔奖悴幌胗Hel
>
> > er类而直接写在业务类里也是无可厚非的。
>
>
>
> 我非常同意你的观点,我在实现一个绝对是超多线程,实时?> 求性非常高的调度系统时,大量使用静态方法,目的只有一个
> 匪俣取J率抵っ餍Ч浅:谩?>
>
> 其实,静态函数,新建对象,等个有个的适用范围,充分了?> 它们,扬长避短才是道

用静态方法并不一定提高了你的效率,除非你的方法都是线程安全的,那这样又和采用singleton之类的有多少区别呢?
如果不是线程安全,EJB式的对象池也许更有效率,因为对象是被反复复用的,没有创建对象和GC的开销,这样显然比你在每次方法调用里面初始化非线程安全的对象或者采用同步锁定的方式效率好.
何况大量用静态方法显然不是好的OO设计,为什么需要singleton,为什么需要工厂类(比如EJB home),为什么需要组件接口...

> >
> 在静态方法内部只要没有用到静态成员变量的话,就不会有多
>
> >
> 叱痰奈侍猓singleton也是如此,banq说的情况估计是设
>
> >
> 剖蟆static方法一般用于设计一些通用的Helper类,以节?
> 内存,提高速度,不适宜放在有业务意义的类里面,因为会?>
> >
> 司醯酶嫦蚨韵蟮脑碛兴ケ常绻朔奖悴幌胗Hel
>
> > er类而直接写在业务类里也是无可厚非的。
>
>
>
> 我非常同意你的观点,我在实现一个绝对是超多线程,实时?> 求性非常高的调度系统时,大量使用静态方法,目的只有一个
> 匪俣取J率抵っ餍Ч浅:谩?>
>
> 其实,静态函数,新建对象,等个有个的适用范围,充分了?> 它们,扬长避短才是道

用静态方法并不一定提高了你的效率,除非你的方法都是线程安全的,那这样又和采用singleton之类的有多少区别呢?
如果不是线程安全,EJB式的对象池也许更有效率,因为对象是被反复复用的,没有创建对象和GC的开销,这样显然比你在每次方法调用里面初始化非线程安全的对象或者采用同步锁定的方式效率好.
何况大量用静态方法显然不是好的OO设计,为什么需要singleton,为什么需要工厂类(比如EJB home),为什么需要组件接口...

线程安全的就一定性能低么

singleton就一定性能低么?thinkhard

> 用静态方法并不一定提高了你的效率,除非你的方法都是线程?> 全的,那这样又和采用singleton之类的有多少区别呢?
> 如果不是线程安全,EJB式的对象池也许更有效率,因为对象是?> 反复复用的,没有创建对象和GC的开销,这样显然比你在每次方
> ǖ饔美锩娉跏蓟窍叱贪踩亩韵蠡蛘卟捎猛剿ǖ姆绞叫
> 率好.
> 何况大量用静态方法显然不是好的OO设计,为什么需要singlet
> n,为什么需要工厂类(比如EJB
> home),为什么需要组件接口...

如果一个需要初始化的非线程安全的对象静态方法,在换成用对象池来实现的话,池化对象在调用方法的时候就是不是就不需要重新初始化非线程安全的对象呢?如果不是的话,上一次的方法调用会不会影响到下一次调用。

对象池没有创建对象和GC的开销吗?当并发调用数量大于对象池上限的时候呢?另外,还有池化对象的开销以及对象钝化时的开销呢,虽然这些不是影响调用效率的东西。显然对象池只适用于一些重量级对象。

静态方法和singleton的确很类似,完全可以用singleton替代。

> >
> 用静态方法并不一定提高了你的效率,除非你的方法都是线程?
> 全的,那这样又和采用singleton之类的有多少区别呢?
> >
> 如果不是线程安全,EJB式的对象池也许更有效率,因为对象是?
> 反复复用的,没有创建对象和GC的开销,这样显然比你在每次?>
> >
> ǖ饔美锩娉跏蓟窍叱贪踩亩韵蠡蛘卟捎猛剿ǖ姆绞叫
>
> > 率好.
> >
> 何况大量用静态方法显然不是好的OO设计,为什么需要singlet
>
> > n,为什么需要工厂类(比如EJB
> > home),为什么需要组件接口...
>
> 如果一个需要初始化的非线程安全的对象静态方法,在换成用
> 韵蟪乩词迪值幕埃鼗韵笤诘饔梅椒ǖ氖焙蚓褪遣皇蔷筒恍
> 要重新初始化非线程安全的对象呢?如果不是的话,上一次的
> 椒ǖ饔没岵换嵊跋斓较乱淮蔚饔谩?>
> 对象池没有创建对象和GC的开销吗?当并发调用数量大于对象
> 厣舷薜氖焙蚰兀苛硗猓褂谐鼗韵蟮目约岸韵蠖刍钡
> 开销呢,虽然这些不是影响调用效率的东西。显然对象池只适
> 糜谝恍┲亓考抖韵蟆?>
> 静态方法和singleton的确很类似,完全可以用singleton替代
> ?
分特啊,呵呵,如果你用对象池显然非线程安全对象就可以不作为方法的本地变量,作为类的实例变量了,显然不用初始化了...对象池当然也有限制,不过这是硬件瓶颈了.虽然有实例变量,但这是无状态的对象,干吗要钝化呢?对象是不是重量级一点都不重要,而如果你的应用需要高性能高伸缩性而又需要线程安全, 对象池就是有价值的.

static方法就是为了线程安全,而不能用静态实例变量,得改为方法的本地变量,而不得不每次都进行初始化。对象池的确是线程安全的,所以可以用实例变量,但用到实例变量的话,对象肯定是有状态的。假如这种状态会影响到下一次的调用,肯定还得还得把相关的实例变量重新初始化。所以不见得用对象池可以节省这方面的开销而提高性能。

我不认为轻量级对象有必要为了线程安全而用到对象池,宁可每次new一个对象来保证线程安全,因为轻量级对象的创建和销毁的开销是很小的,滥用对象池只会把系统结构复杂化。

照你这样说有实例变量的SB都是状态会话bean?
轻量级对象创建销毁开销是不大,但是在高并发量的情况下完全可能CPU大量开销,GC忙不过来,甚至造成内存溢出
我从来都没和你讨论对象池是否会滥用,我讲的是上面那位同志说的高并发情况下的问题!

引自Mastering EJB2

A stateless session bean is a bean that holds conversations that span a single
method call. They are stateless because they do not hold multimethod conversations
with their clients. After each method call, the container may choose to
destroy a stateless session bean, or recreate it, clearing itself out of all information
pertaining to past invocations.

不是说有实例变量的SB都是状态会话bean,SLSB也可以有实例变量,只是SLSB每次调用后,容器都会销毁或者重建,而状态会话bean则保留。

同理,对象池也是一样的。如果你想保证池化对象是无状态的,你也得在调用后销毁或重建,也可以选择在方法里面对相关的实例变量重新初始化,如果是选择后者的话,就跟static方法一样了,就不会在这方面比static方法节省创建对象的开销了。如果选择前者,那跟每次new一个对象有什么区别呢?

sigh...
来一段代码
public class Foo
{
private XMLParser xmlp = new XMLParser();

public void bar()
{
xmlp.parse(...);
}
}
因为XMLParser不是线程安全的,所以不能被并发使用,如果以上对象是singleton的就出问题了. 而我们对象池每个请求都是一个不同对象响应,所以保证了xmlp的线程安全.
楼上说的东西既然能够改为static,显然是属于无状态对象,所以只会有相同的实例变量之类(也可以改为本地变量).有实例变量不等于有状态!你说上面的对象是有状态的吗?

>may choose to destroy a stateless session bean, or recreate it
ed roman说的是may选择销毁之,只有最弱智的容器才会这样做...都会放到对象池中,然后重用...除非要减少bean池大小

> sigh...
> 来一段代码
> public class Foo
> {
> private XMLParser xmlp = new XMLParser();
>
> public void bar()
> {
> xmlp.parse(...);
> }
> }
> 因为XMLParser不是线程安全的,所以不能被并发使用,如果以?> 对象是singleton的就出问题了.
> 而我们对象池每个请求都是一个不同对象响应,所以保证了xml
> 的线程安全.
> 楼上说的东西既然能够改为static,显然是属于无状态对象,所
> 灾换嵊邢嗤氖道淞恐?也可以改为本地变量).有实例变
> 坎坏扔谟凶刺?你说上面的对象是有状态的吗?
>


就你这段代码来说,非线程安全的是XMLParser
public class Foo
{
private static Foo foo = new Foo();

private Foo(){}

public Foo getInstance()
{
return foo;
}

public void bar()
{
XMLParser xmlp = new XMLParser();
xmlp.parse(...);
}
}
这样Singleton实现会有问题吗?如果你说XMLParser开销太大,那是另外一回事,那应该对XMLParser进行池化处理,而不要怪到Singleton实现上。

> > sigh...
> > 来一段代码
> > public class Foo
> > {
> > private XMLParser xmlp = new XMLParser();
> >
> > public void bar()
> > {
> > xmlp.parse(...);
> > }
> > }
> >
> 因为XMLParser不是线程安全的,所以不能被并发使用,如果以?
> 对象是singleton的就出问题了.
> >
> 而我们对象池每个请求都是一个不同对象响应,所以保证了xml
>
> > 的线程安全.
> >
> 楼上说的东西既然能够改为static,显然是属于无状态对象,所
>
> >
> 灾换嵊邢嗤氖道淞恐?也可以改为本地变量).有实例变
> > 坎坏扔谟凶刺?你说上面的对象是有状态的吗?
> >
>
>
> 就你这段代码来说,非线程安全的是XMLParser
> public class Foo
> {
> private static Foo foo = new Foo();
>
> private Foo(){}
>
> public Foo getInstance()
> {
> return foo;
> }
>
> public void bar()
> {
> XMLParser xmlp = new XMLParser();
> xmlp.parse(...);
> }
> }
> 这样Singleton实现会有问题吗?如果你说XMLParser开销太大
> 鞘橇硗庖换厥拢怯Ω枚XMLParser进行池化处理,而不要
> 值Singleton实现上。

EJB的好处就是不用你自己去对每个非线程安全的对象进行池化...
我不继续说了...

倒,扯EJB的好处去了,我又没说EJB不好