回顧生產者/消費者問題下產生的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();
看下一篇,順便我們回顧下多線程並發的幾個經典問題
本文出自 “菜鳥也要修煉技術” 博客

發佈留言