使用ConcurrentLinkedQueue惨痛的教训
教训 使用
2023-09-11 14:17:57 时间
服务端原本有个定时任务对一个集合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().
总结了下, 在单位缺乏性能测试下,对自己的编程要求更加要严格,特别是在生产环境下更是要小心谨慎。
相关文章
- 【软件测试】不好,事搞大了,APP测试的血泪教训总结......
- 当随机不够随机:一个在线扑克游戏的教训
- 软件测试经验与教训
- 软件测试经验与教训
- 从今年的安全泄露事故学到的6个教训
- 【数据】开发iOS应用,不得不看的数据和教训
- 【数据】开发iOS应用,不得不看的数据和教训
- 【教训】徐小平:不要用兄弟情谊来追求共同利益,要用共同利益追求兄弟情谊
- 十多年来从三个容器管理系统中吸取的教训
- 两年AI研究经验(教训)总结,进来看看吧!
- axis2调用webservice教训
- 晚上惨痛还车经历教训
- 血的教训!雨天用车务必注意这几点
- 血的教训:“愚蠢的”程序员,该如何为你的源码报价呢?(转)
- 4000亿美金的教训:比尔盖茨最遗憾的事,成了华为鸿蒙的指引(比尔盖茨接受采访表示赞同,他这些年一直都很烦恼,觉得自己亲手毁掉了微软一个价值 4000 亿美刀的机会)
- 《基于模型的软件开发》——1.3 宝贵教训
- 自动化测试实践经验和教训
- 勒索病毒危机最大教训:黑客技术并非总是掌握在好人之手
- 2016年哪些IT教训可以成为2017的铺路砖?
- 猿创征文|独特且教训的技术成长之路
- pysql public.res_partner 数据表备份血的教训 postgres数据库
- 四. 200多万元得到的创业教训--3招实现外包的华丽转身
- 你应该知道的15个ERP部署失败的教训
- 关于域名备案后的注意事项,血淋淋的教训
- 使用ConcurrentLinkedQueue惨痛的教训【转】
- 从weblogic的一个教训
- 万卷书 - 历史的教训 The Lessons of History
- Cloudflare泄露客户数据,IT部门可从中吸取什么教训?
- Twitter联合创始人再创业当CEO后想分享5条教训