现在有个系统要同时处理很多个请求,对于每笔请求系统都会创建一个线程或从线程池中取出一条线程来处理,处理后计算出处理的时间,最后计算出总的时间现在的办法是用一个全局变量,在每条线程中将该线程计算出的处理时间累加到全局变量上,因为是多线程所以这个过程使用了锁但是这样的话,当线程数量庞大时,因为锁的缘故,多线程变单线程,这会严重影响系统性能,那么有什么办法不用锁或不用全局变量来实现所有处理时间的累加吗??
解决方案 »
- 新学rmi,请教!!高分!!
- 瑞星软件中怎么连接到网页,显示网页的内容.JFRAME中点JBUTTON怎么连接到网页中,象瑞星软件那样 ,你们都知道点瑞星软件中的SUPPORT就可以
- 一个疑惑的基础问题?
- 一个JAVA初学者的困惑!
- 有个关于JDBC连接SQL SERVER的问题。。。。。
- 使用JAVA能直接调用word中底层的API函数吗,
- 请问怎么样把一个JDialog设置在最前?
- 这里没有高手吗?
- webservice客户端调用服务报错
- 读取.dat文件 中文是乱码 该怎么解决
- 怎么输出当前日期, 格式为Auguest 1, 2009
- (接上帖,再100分)java反射机制RMI(远程方法调用)的效率如何?
把每一个线程的耗时,存到结构中,最后取出再相加即可。以数组为例,你创建一个线程的时候,告诉这个线程存储的位置即可,这样就不需要同步了。
每一个线程操作自己的变量,就解决问题了,需要的时候再相加。
synchronized(lock){
totalTime+=threadTime;
}
应该不至于导致太大的开销。
创建了第一个线程,就以a[0]为单元,到时候写a[0]创建了第二个线程的时候,就把a[1] 分配给它。
明白我的意思不?
synchronized(lock){
totalTime+=threadTime;
}
导致太大的开销,因为有锁。那么CocurrentHashMap也是不行的,因为也用到了锁。对简单数组进行同步也是不行的,因为也用到了锁。一楼的高手认为:以数组为例,你创建一个线程的时候,告诉这个线程存储的位置即可,这样就不需要同步了。 每一个线程操作自己的变量,就解决问题了,需要的时候再相加。这个方案我考虑了很久,开始感觉是可以的。不用同步数组,这样就不用锁了。但是仔细一想,那个线程在数组中的存储位置还是需要同步,正如楼主自己分析的那样。基于以上讨论:感到只有用java.util.concurrent.atomic.AtomicInteger或者java.util.concurrent.atomic.AtomicLong了。那是一种 lock-free 或 wait-free 方法。下面这篇文章对它和同步的速度进行了比较:
http://www.ibm.com/developerworks/java/library/j-jtp11234/以上是我非常粗略的分析,希望大家多提意见,共同学习进步。
又仔细看了看,用线程池的话这样是可以的。汗...不过楼主正好可以比较一下这个方案和java.util.concurrent.atomic.AtomicLong哪个快。单从编码角度来讲,java.util.concurrent.atomic.AtomicLong会比较简单一些。
在Java里,不知道多线程同时访问数组中的两个元素会不会抛异常???
至于你说的数组大小的问题,我觉得那是小问题,就算定义一个1000个元素的数组,占用的内存也大不到哪去。
数组的大小不是线程池大小,而是和请求的数量相同,每个请求有一个唯一的流水号,流水号的获得就是使用AtomicLong累加获得的,每个请求的时间存入与流水号对应的数组中的位置,全部处理完了之后再来处理数组中的时间,这样不敢说是最好的方法,但至少解决问题了 呵呵