使用ConcurrentLinkedQueue惨痛的教训【转】
2024-09-12 15:12:17
转自:http://blog.csdn.net/jackpk/article/details/49634577
服务端原本有个定时任务对一个集合ArrayList 中的消息做处理。 因为考虑到处理消息是先进先出原则,所以优化的时候考虑改用ConcurrentLinkedQueue 当时没仔细深入研究过这个集合就匆匆上线了。结果刚上线第二天就出问题了。服务端一次优化演变成了一个缺陷,还好及时回退了版本,后果才不是很严重。回退后对ConcurrentLinkedQueue 做了一个简单的测试代码,如下:
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ConcurrentLinkedQueueTest { private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>(); private static int count = 100000; private static int count2 = 2; // 线程个数 private static CountDownLatch cd = new CountDownLatch(count2); public static void dothis() {
for (int i = 0; i < count; i++) {
queue.offer(i);
}
} public static void main(String[] args) throws InterruptedException {
long timeStart = System.currentTimeMillis();
ExecutorService es = Executors.newFixedThreadPool(4);
ConcurrentLinkedQueueTest.dothis();
for (int i = 0; i < count2; i++) {
es.submit(new Poll());
}
cd.await();
System.out.println("cost time " + (System.currentTimeMillis() - timeStart) + "ms");
es.shutdown();
} static class Poll implements Runnable {
@Override
public void run() {
//while (queue.size() > 0) { // 效率低,每次都需要计算整个队列的个数
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
cd.countDown();
}
}
}
运行结果:
costtime 2360ms
改用while (queue.size() > 0)后运行结果:
cost time 46422ms
结果居然相差那么大,看了下ConcurrentLinkedQueue的API 原来.size() 是要遍历一遍集合的,难怪那么慢,所以尽量要避免用size而改用isEmpty().
总结了下, 在缺乏性能测试的情况下,对自己的编程要求更加要严格,特别是在生产环境下更是要小心谨慎。
最新文章
- JavaScript 的面向对象
- ios开发xcode中设置代码块
- Android权限列表permission说明
- HDU 4647 Another Graph Game(贪心)
- Uva 11754 Code Feat
- 第四周 更新Scrum站立会议
- Oracle 11g R2 常用配置与日志的文件位置
- Angular基础教程:表达式日期格式化[转]
- linux网络编程之TCP/IP基础
- Bash启动选项
- Dancing Links 学习笔记
- GMA Round 1 三角形
- [math] 我对对数的最新理解
- leetcode207
- 《蹭课神器》Beta版使用说明
- RCNN
- [qt]qstring和string中文支持转换问题
- Redis简单生产者消费者
- c++之enum(枚举)可以没有枚举名
- 简单使用DESeq做差异分析
热门文章
- 【硅谷问道】Chris Lattner 访谈录(下)
- 记录-UEFI启动的预装WIN8的笔记本里引导linux双系统
- 【内核】linux2.6版本内核编译配置选项(二)
- spark编译报错信息简介
- idea 在tomcat中部署的时候 莫名其妙的错误
- iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
- 好用的vim插件
- spring batch中MyBatisPagingItemReader分页使用介绍
- DLL封装Interface(接口)(D2007+win764位)
- 基于jQuery环形图标菜单旋转切换特效