欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決記錄

 更新時(shí)間:2022年03月01日 11:10:53   作者:kl  
系統(tǒng)相關(guān)使用人員反饋系統(tǒng)故障,這篇文章主要介紹了線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決的記錄,有需要的朋友可以借鑒參考下

事件背景

系統(tǒng)相關(guān)使用人員反饋系統(tǒng)故障,日志顯示從ams系統(tǒng)服務(wù)提示dubbo處理線程不足,具體異常信息如下:

問題定位

從上圖可知,dubbo的處理線程池滿了,默認(rèn)200個(gè)線程,活動(dòng)線程也是200個(gè)。這個(gè)現(xiàn)象非常不正常,我們的應(yīng)用并發(fā)還沒有到這個(gè)程度能同時(shí)占用200個(gè)線程處理請(qǐng)求。然后去讀了下dubbo源碼,發(fā)現(xiàn)dubbo也認(rèn)為這種情況不正常,然后幫我們記錄了應(yīng)用的線程堆棧信息,這個(gè)非常贊。代碼如下:

上面這段代碼,在線程池不夠用時(shí),會(huì)每隔十分鐘輸出一份dump文件到用戶目錄,如:

在dump文件中,我們找到了耗盡DubboServerHandler線程池最后一個(gè)線程

通過分析得知:是我們應(yīng)用程序有段代碼導(dǎo)致的問題,在特定條件下會(huì)觸發(fā)線程死鎖,代碼如下

代碼中定義了一個(gè)線程屏障CyclicBarrier,同行數(shù)(調(diào)用await的線程數(shù))是11,用來處理十個(gè)線程的運(yùn)算,然后都計(jì)算完后拿到處理結(jié)果。本身代碼沒有什么問題,在沒有并發(fā)的情況下,不會(huì)觸發(fā)問題。但是注意中間那個(gè)箭頭,執(zhí)行線程的線程池是固定大小20的線程池,故當(dāng)同時(shí)并發(fā)數(shù)多于2個(gè)的時(shí)候線程池的線程會(huì)不夠用,導(dǎo)致線程等待,然后CyclicBarrier的main線程也會(huì)等待其他線程中的await。這就造成了相互等待,下一個(gè)請(qǐng)求過來還是繼續(xù)等待,也就是死鎖了。至此所有問題都以清晰明朗了。

解決問題

方案一:改CyclicBarrier為CountDownLatch,這個(gè)兩個(gè)并發(fā)工具都是jdk1.5推出為了簡(jiǎn)化并發(fā)編程,CyclicBarrier的await會(huì)占用線程池中的線程不釋放,導(dǎo)致線程不足,而CountDownLatch的count不會(huì)

方案二:改線程池類型為CachedThreadPool,不會(huì)應(yīng)為線程池線程不夠用,導(dǎo)致相互等待

文末結(jié)語

java并發(fā)包提供了豐富的api來簡(jiǎn)化多線程模型的開發(fā),但是在針對(duì)多線程模型業(yè)務(wù)開發(fā)時(shí),我們還需要多留心下多線程帶來的坑??傊嗪藭r(shí)代推薦大家多使用多線程開發(fā),同時(shí),也要對(duì)使用的工具有更多的了解

以上就是線上dubbo線程池耗盡CyclicBarrier線程屏障異常的詳細(xì)內(nèi)容,更多關(guān)于dubbo線程池耗盡CyclicBarrier線程屏障的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java排序算法中的冒泡和選擇排序

    詳解Java排序算法中的冒泡和選擇排序

    這篇文章主要給大家介紹了Java排序算法中的冒泡排序和選擇排序,文中有詳細(xì)的圖文解釋和代碼示例,對(duì)我們學(xué)習(xí)Java算法有一定的幫助,感興趣的同學(xué)可以參考閱讀下
    2023-06-06
  • Spring集成MyBatis?及Aop分頁的實(shí)現(xiàn)代碼

    Spring集成MyBatis?及Aop分頁的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Spring集成MyBatis?及Aop分頁的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java中Lambda表達(dá)式基礎(chǔ)及使用

    Java中Lambda表達(dá)式基礎(chǔ)及使用

    這篇文章主要介紹了Lambda 是JDK 8 的重要新特性。它允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中),使用 Lambda 表達(dá)式可以使代碼變的更加簡(jiǎn)潔緊湊,使Java代碼更加優(yōu)雅,感興趣的小伙伴一起來學(xué)習(xí)吧
    2021-08-08
  • 淺談Java讀寫注冊(cè)表的方式Preferences與jRegistry

    淺談Java讀寫注冊(cè)表的方式Preferences與jRegistry

    這篇文章主要介紹了淺談Java讀寫注冊(cè)表的方式Preferences與jRegistry,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 深入理解Java三大特性中的多態(tài)

    深入理解Java三大特性中的多態(tài)

    多態(tài)性是對(duì)象多種表現(xiàn)形式的體現(xiàn)。在面向?qū)ο笾?,最常見的多態(tài)發(fā)生在使用父類的引用來引用子類的對(duì)象。下面這篇文章主要給大家深入的介紹了Java三大特性中多態(tài)的相關(guān)資料,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)

    詳解Spring依賴注入的三種方式以及優(yōu)缺點(diǎn)

    IoC?和?DI?是?Spring?中最重要的兩個(gè)概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴注入為其(IoC)具體實(shí)現(xiàn)。那么?DI?實(shí)現(xiàn)依賴注入的方式有幾種?這些注入方式又有什么不同?本文就來和大家一起詳細(xì)聊聊
    2022-08-08
  • spring boot微服務(wù)自定義starter原理詳解

    spring boot微服務(wù)自定義starter原理詳解

    這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java的線程池框架及線程池的原理

    java的線程池框架及線程池的原理

    這篇文章主要介紹了java的線程池框架及線程池的原理的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringMVC @RequestMapping注解作用詳解

    SpringMVC @RequestMapping注解作用詳解

    通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • java高并發(fā)InterruptedException異常引發(fā)思考

    java高并發(fā)InterruptedException異常引發(fā)思考

    這篇文章主要為大家介紹了java高并發(fā)InterruptedException異常引發(fā)思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論