使用ConcurrentLinkedQueue惨痛的教训【转】

转自:http://blog.csdn.net/jackpk/article/details/49634577

服务端原本有个定时任务对一个集合ArrayList 中的消息做处理。 因为考虑到处理消息是先进先出原则,所以优化的时候考虑改用ConcurrentLinkedQueue 当时没仔细深入研究过这个集合就匆匆上线了。结果刚上线第二天就出问题了。服务端一次优化演变成了一个缺陷,还好及时回退了版本,后果才不是很严重。回退后对ConcurrentLinkedQueue 做了一个简单的测试代码,如下:

 1 import java.util.concurrent.ConcurrentLinkedQueue;
 2 import java.util.concurrent.CountDownLatch;
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5
 6 public class ConcurrentLinkedQueueTest {
 7
 8     private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>();
 9
10     private static int count = 100000;
11
12     private static int count2 = 2; // 线程个数
13
14     private static CountDownLatch cd = new CountDownLatch(count2);
15
16     public static void dothis() {
17         for (int i = 0; i < count; i++) {
18             queue.offer(i);
19         }
20     }
21
22     public static void main(String[] args) throws InterruptedException {
23         long timeStart = System.currentTimeMillis();
24         ExecutorService es = Executors.newFixedThreadPool(4);
25         ConcurrentLinkedQueueTest.dothis();
26         for (int i = 0; i < count2; i++) {
27             es.submit(new Poll());
28         }
29         cd.await();
30         System.out.println("cost time " + (System.currentTimeMillis() - timeStart) + "ms");
31         es.shutdown();
32     }
33
34     static class Poll implements Runnable {
35         @Override
36         public void run() {
37             //while (queue.size() > 0) {    // 效率低,每次都需要计算整个队列的个数
38             while (!queue.isEmpty()) {
39                 System.out.println(queue.poll());
40             }
41             cd.countDown();
42         }
43     }
44 }

运行结果:

  costtime 2360ms

改用while (queue.size() > 0)后运行结果:

  cost time 46422ms

结果居然相差那么大,看了下ConcurrentLinkedQueue的API 原来.size() 是要遍历一遍集合的,难怪那么慢,所以尽量要避免用size而改用isEmpty().

总结了下, 在缺乏性能测试的情况下,对自己的编程要求更加要严格,特别是在生产环境下更是要小心谨慎。

时间: 2024-09-29 01:24:43

使用ConcurrentLinkedQueue惨痛的教训【转】的相关文章

9-12基础加强考试自我感觉------惨痛的教训!

九月十二号晚上七点  进行了一次基础加强考试  对前面的二十天的一次总结,平心而论,这次的题目不难,但是我还是不能随心所欲的敲出来,这说明前面学的知识我没有学懂或者说我是在不懂装懂,这次考试在我心中的定义是一次完美并且惨痛的失败,完美让我领悟了许多,惨痛让我时刻铭记,就让这次失败当成我学习记得警钟,时刻提醒我! private void Form1_Load(object sender, EventArgs e) { string path = @"F:\新建文件夹"; getname

惨痛的教训 没有 脑子的我

重要的事情说三遍 if一定要加大括号!!!!if一定要加大括号!!!!if一定要加大括号!!!! # include<stdio.h> int main() { int m,n,i,j,h,k,leap,a[101][101]={0},c=0; scanf("%d %d",&n,&m); for( i=0;i<n;i++) { for( j=0;j<n;j++) { scanf("%d",&a[i][j]); } }

ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <

记一次惨痛的教训

首先写在前面, 2017年8月4号,周六晚上, 由于c盘满了,在卸载软件,清理空间等等方法都试过以后,仍然不能满足我的需要,我决定重装系统. 于是在网上随便找了一个一键Ghost的软件,然后准备装电脑,我格式化了c盘还有D盘, c盘是固态盘,单独的, D盘以及后面的E,F,G 都是在一起的,空间1TB. 我格式化D盘以后,后面整个的都被格式化了.我也不清楚是操作失误,还是软件的bug,反正我的东西就没了. 没了,没了.... 正式的项目文件,还在服务器TFS上,唯一损失的就是我本地的测试代码,测

我的第一次项目管理--一次惨痛的教训

最近总想发点时间写些东西但抽不出时间,趁着放年假并且今天刚开完项目的年前回顾会议赶紧写出来,其实挺不好意思讲的,有点尴尬. 莫名的项目负责人: 由于公司逐步发展,项目越来越多,没有人有时间来负责这个项目,我的老板们可能看我比较顺眼于是便让我来负责这次的项目开发,于是我便莫名其妙的变成了项目负责人,一开始我是拒绝的,让一个什么都不懂的人来管理项目真的是太可怕了.哦,忘了说明,我们的项目成员就几个人并且每个人都身兼多个项目开发任务,因为是小公司. 项目工作量的预估: 当时在做工作量预估的时候参考了像

Android 原生开发、H5、React-Native使用利弊和场景技术分享

http://m.blog.csdn.net/article/details?id=51778086 发表于2016/6/28 18:52:46  1176人阅读 最近工作中接触到React-Native框架,对其进行一些技术分析,结合之前了解的H5的一部分,加上自己做了很久的原生开发(十几个android app.sdk,包括2个ios), 总结下目前了解到的这三种移动端应用开发方式的特点和试用范围,作为个人知识的记录,也作作为公司内部互相学习的分享. 一.原生开发   原生开发是系统自带的a

BZOJ 1084 最大子矩阵 终于过了

一开始看到这道题,由于觉得m <= 2, 所以觉得这是道水题,回去后想了一下.在晚上来机房的时候已经想出来了,但是我必须承认细节决定成败.远在一个小时前我就已经把算法的主体都写好了,但是就是一直WA,为什么就是各种粗心,真心想捏死自己.一个小时就这么白白浪费了.我希望明天的我能变得强大一点.在有了今日惨痛的教训之后. 这道题并不难.用d[i][j][k] 来表示状态.i表示第几行,j表示之前取了多少个矩阵,k表示上一行的状态.即上一行的矩阵取法.如果k == 0 那么没有一个矩阵延伸到上一行,如

联发科VS高通,谁是最强土豪“芯”?

今年是iPhone诞生的第七个年头,网络上涌现了大量"七年之痒"的感概,加之权威数据显示,智能手机增长速度连续第七个季度下滑,让一些悲观主义者预言:智能手机已经步入PC式的黄昏时代.但笔者认为,智能手机非但没有近黄昏,反倒是刚刚掀开自己的"大时代".其实,iPhone于2007年横空出世时,富士康的流水线上仍然如火如荼地组装着诺基亚N82,从最帅CEO到最美女工们,全部统一地坚信:Nokia是世界上最好的手机,经久不衰,无可取代,前途无量,而这款精美的智能机几乎没有

看完《Thinking in Java》后,我觉得自己就是一个不懂编程的小孩子,如何快速摆脱这种自卑感

我虽然不懂java也不懂程序员,但我理解这种心情.当看到自己还算自信的专业领域中一部超越自己水平很多的作品或比自己优秀太多的人,难免会感到震惊,继而进行自我否定. 就像我曾经非常喜欢写作,在杂志和校报上发表了几篇后更是得意,可是加入文学社之后,被一个低年级女生斐然的文采和独特的角度彻底震惊了,同样的题目她能从我们完全想不到的角度去写,还拿过某作文大赛全国冠军,年少的我非常自卑,后面去的越来越少乃至退社.现在我只觉得非常后悔,因为我后面在生活中遇到了更多文字牛逼的人物,我觉得自己放弃的太早了,失去