回顾生产者/消费者问题下产生的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();
看下一篇,顺便我们回顾下多线程并发的几个经典问题

你可能感兴趣的:(多线程,并发,职场,休闲,队列柱塞式)