回顾生产者/消费者问题下产生的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
问题:到底是什么原因呢?死锁?死循环?频繁执行某个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
相关文章推荐
- 回顾生产者/消费者问题下产生的java多线程(二)
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 黑马程序员-java多线程生产者消费者问题
- 生产者与消费者问题(java多线程实现)
- 继续java多线程——生产者消费者类似问题
- 【java 多线程】多线程并发同步问题及生产者、消费者问题
- Java多线程的一个案例-生产者消费者问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- 由生产者/消费者问题看JAVA多线程
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
- java多线程之生产者消费者经典问题
- Java 多线程 生产者与消费者问题测试代码
- Java多线程之生产者/消费者问题
- 由生产者/消费者问题看JAVA多线程
- 22.用JAVA中的多线程示例生产者和消费者问题
- 多线程经典问题之生产者消费者问题的JAVA实现
- Java 多线程实现生产者消费者问题(wait/notify)