您的位置:首页 > 编程语言 > Java开发

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

2011-08-24 12:10 393 查看
引子:Uxx线上机器,发现两颗CPU的使用率高达100%。但是load还是比较低的,8核机器,load=2。
问题:到底是什么原因呢?死锁?死循环?频繁执行某个task?频繁FGC?一时间猜测纷纭。。。。
蛛丝马迹:[/b]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();看下一篇,顺便我们回顾下多线程并发的几个经典问题本文出自 “菜鸟也要修炼技术” 博客,请务必保留此出处http://vicky001.blog.51cto.com/2004660/647708
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: