站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题多用户并发条件下单例模式是否是有害的

多用户并发条件下单例模式是否是有害的

摘要: 多用户并发条件下单例模式是否是有害的


使用单例,保证了一个应用只有一个实例,提前实例化,确实是节省了时间,但是,多用户并发下,所有的线程都使用这一个实例,是否会有争用引起的性能问题呢?
请给出理由,如果有测试案例就更好了。


不知道楼主采用什么机制?
单例理解:
一个调用来 invoke实体或者其它,先查找相关是否存在,一旦这个时候没有实力化,那么就创建,依次类用:)
这个对于资源消耗小点,但是安全确实有点问题:)
所以要看是什么了


1.多用户并发调用同一个单例的时候需要进行线程同步。
2.如果并发的可能性比较高,那么应该考虑做一个单例的pool。这样既有单例的好处,又有较强的并发处理能力。




性能上没有问题,同一个实例是可以在不同的线程同时调用的
安全上可能有问题,对需要访问互斥资源的方法需要做同步


最好不要用单例吧,否则出了什么安全问题,那个代价比节省那点时间和资源的代价大多了


一般都是没有没有害处的
但是如果象下面的样子,十有八九是有害的
class SomeClass{
private int a;
protected SomeClass(){}
public static SomeClass getInstance(){...}
public int getA(){...}
public void setA(int a){...}
}
例如有人在servlet中这样写,可想而知会怎样了!


其实,我的担心是多线程访问一个实例,是否有争用的问题;
很久没有上csdn,所以没有看到大家的帖子,不好意思


读《深入java虚拟机》,在类上有个对象锁,多个线程访问同一个实例,应该是在一个瞬间只有一个线程取得对象锁,从而对对象操作,其他线程等待吧?
如果是这样,单例不是就有严重的问题了吗?应该不这样,在多用户多线程下,可以多new几个。


我认为单例是要有条件的使用的。多用户情况会有一些资源如模板、连接等可以共享的,所以要单例来管理,以加快速度,不用每次都要加载一次。还有一些要求线程锁定的操作,同一时间只能一个用户操作的,那就要用单例。


我认为只在不用单例不行的时候才用单例,比如 ftiger(哈哈鱼) 说的一个时间点只能有一个用户操作的情况,这才时单例使用的时候;
从一个类执行的角度考虑,对象锁是存在的,并且多线程访问一个类,也确实是串行访问的(如同oracle里的latch),我的忧虑其实是在这一点上,不知道有没有道理;


做了单例模式在多线程条件下的性能测试,结果表明我的想法是正确的:试图用单例来换取性能是不可行的,并发量较小(一般小于200),单例没有任何性能优势,也就没有使用必要,并发量较大(超过500),单例会引起类资源的争用,实例化速度急剧降低。这个测试说明:weblogic的最大线程=EJB实例的最大实例数=EJB中成员类(也就是业务类)的最大实例数,这几个东西是一条线下来的,是有内在关系的。
测试结果数据:
一 使用单例模式:
并发数量: 需要EJB实例数量 需要业务类实例数量 业务类实例化时间平均毫秒数
200 28 28 1
500 33 33 51
二 使用传统技术:
并发数量: 需要EJB实例数量 需要业务类实例数量 业务类实例化时间平均毫秒数
200 28 28 1
500 33 33 1
从以上结果可以看出:
第一:在多线程下,使用传统技术实例化类,根本不存在性能问题;
第二:在多线程下,使用单例模式实例化类,有比较严重的性能问题;



↑返回目录
前一篇: 100分求段java代码,谢谢各位了!
后一篇: java和tomcat的环境配置