回顾生产者/消费者问题下产生的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 ,