当前位置:编程学习 > JAVA >>

回顾生产者/消费者问题下产生的java多线程(一)

引子:Uxx线上机器,发现两颗CPU的使用率高达100%。但是load还是比较低的,8核机器,load=2。

 
问题:到底是什么原因呢?死锁?死循环?频繁执行某个task?频繁FGC?一时间猜测纷纭。。。。
 
蛛丝马迹:1)利用java自带的工具JVisualVM,观察下线程,看到了两个活动的线程,这不是Uxx的某task么?如下图所示
 
 
 

 
2)dump线程出来看下


 
3)定位到代码去看看
PersonInfoSynchronizer(){
                        Runnable updateProfileByLoginIdWorker = new Runnable() {

                                public void run() {
                                        loginIds = new ConcurrentSkipListSet<String>();
                                        while (true) {
                                                if (!intlLoginIdQueue.isEmpty()) {
                                                       xxxxxxxxxxxx// 业务代码
                                                        }
                                                }
                                        }

                                }
                        };
 
解决措施和分析 1)在不了解任务业务逻辑的情况下,给while中加一个Thread.sleep。防止在if条件不满足的场景下,CPU不断执行空操作。
此时CPU的负载瞬间下降下来。
(在满足if的情况下,CPU的负载反而不那么大,注释掉的业务代码中,有一系列远程通信过程,CPU并未成为瓶颈,而是网络,JVM内存等其他因素)
2)更优雅的解决方案:阻塞队列queue.take();
看下一篇,顺便我们回顾下多线程并发的几个经典问题
本文出自 “菜鸟也要修炼技术” 博客

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,