日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

警惕!SpringBoot錯誤發(fā)布事件,造成死鎖Deadlock

來源: 責(zé)編: 時間:2024-06-12 08:43:40 221觀看
導(dǎo)讀環(huán)境:SpringBoot3.2.51. 死鎖復(fù)現(xiàn)1.1 自定義事件監(jiān)聽public class PackApplicationEvent extends ApplicationEvent { private String message ; public PackApplicationEvent(String message, Object source) {

環(huán)境:SpringBoot3.2.5eRo28資訊網(wǎng)——每日最新資訊28at.com

1. 死鎖復(fù)現(xiàn)

1.1 自定義事件監(jiān)聽

public class PackApplicationEvent extends ApplicationEvent {  private String message ;  public PackApplicationEvent(String message, Object source) {    super(source) ;    this.message = message ;  }  public String getMessage() {    return message ;  }}

自定義事件,接收消息及相關(guān)數(shù)據(jù)eRo28資訊網(wǎng)——每日最新資訊28at.com

1.2 自定義事件監(jiān)聽

@Componentpublic class PackApplicationListener implements ApplicationListener<PackApplicationEvent> {  @Override  public void onApplicationEvent(PackApplicationEvent event) {    System.out.printf("接收到事件消息: %s, 數(shù)據(jù): %s%n", event.getMessage(), event.getSource().toString()) ;    // TODO  }}

該事件監(jiān)聽器只打印了信息。eRo28資訊網(wǎng)——每日最新資訊28at.com

1.3 發(fā)布事件

@Componentpublic class EventProcessor {  public EventProcessor(ApplicationEventPublisher eventPublisher) {    Thread t = new Thread(() -> {      eventPublisher.publishEvent(new PackApplicationEvent("自定義事件", EventProcessor.this));    });    t.start() ;    try {      System.out.println("線程啟動,等待執(zhí)行完成...") ;      t.join() ;    } catch (InterruptedException e) {      System.err.printf("線程中斷: %s, 錯誤: %s%n", Thread.currentThread().getName(), e.getMessage()) ;    }  }}

該Bean在構(gòu)造函數(shù)中新啟一個線程發(fā)布事件,同時通過join方法等待線程執(zhí)行完成。eRo28資訊網(wǎng)——每日最新資訊28at.com

上面的程序運行后,發(fā)現(xiàn)輸出了上面的打印內(nèi)容后應(yīng)用沒有繼續(xù)運行。打印整個線程棧(通過jstack命令查看),如下:eRo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片eRo28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)線程信息,main線程在創(chuàng)建EventProcessor對象時,會先持有DefaultSingletonBeanRegistry.singletonObjects這個ConcurrentHashMap對象鎖接著創(chuàng)建EventProcessor對象實例,在調(diào)用該對象的構(gòu)造函數(shù)時,啟動新的線程Thread-1,該線程發(fā)布事件同時通過join方法等待T1這個線程完成,在發(fā)布事件時Spring容器會獲取所有的ApplicationListener,此時就會又創(chuàng)建PackApplicationListener對象,創(chuàng)建該對象同樣要獲取singletonObjects鎖對象,這樣就造成了死鎖。eRo28資訊網(wǎng)——每日最新資訊28at.com

主線程

圖片圖片eRo28資訊網(wǎng)——每日最新資訊28at.com

主線程創(chuàng)建EventProcessor對象。eRo28資訊網(wǎng)——每日最新資訊28at.com

Thread-1線程

圖片圖片eRo28資訊網(wǎng)——每日最新資訊28at.com

Thread-1線程獲取容器中的ApplicationListener類型的bean,該過程將執(zhí)行到如下步驟:eRo28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片eRo28資訊網(wǎng)——每日最新資訊28at.com

main線程持有singletonObjects鎖,Thread-1線程又期望獲取到該鎖,但是main線程還要等待Thread-1線程執(zhí)行完成。這死鎖了。eRo28資訊網(wǎng)——每日最新資訊28at.com

以上是對死鎖的復(fù)現(xiàn)及原因進(jìn)行了分析,接下來進(jìn)行問題的解決。eRo28資訊網(wǎng)——每日最新資訊28at.com

2. 解決問題

2.1 解決方式1

不要在構(gòu)造函數(shù)中發(fā)布事件,而是應(yīng)該在所有的單例對象都創(chuàng)建完后再執(zhí)行,也就是實現(xiàn)SmartInitializingSingleton接口,該接口對應(yīng)的回調(diào)方法會在所有的單例bean都創(chuàng)建完以后執(zhí)行,這樣就不會再出現(xiàn)deadlock問題。eRo28資訊網(wǎng)——每日最新資訊28at.com

@Componentpublic class EventProcessor implements SmartInitializingSingleton {  private final ApplicationEventPublisher eventPublisher ;  public EventProcessor(ApplicationEventPublisher eventPublisher) {    this.eventPublisher = eventPublisher ;  }  @Override  public void afterSingletonsInstantiated() {    Thread t = new Thread(() -> {      eventPublisher.publishEvent(new PackApplicationEvent("自定義事件", EventProcessor.this));    });    t.start() ;    try {      t.join() ;    } catch (InterruptedException e) {      System.err.printf("線程中斷: %s, 錯誤: %s%n", Thread.currentThread().getName(), e.getMessage()) ;    }  }}

這樣改造后容器能正常的啟動,同時事件也正常的發(fā)布&監(jiān)聽。eRo28資訊網(wǎng)——每日最新資訊28at.com

afterSingletonsInstantiated方法的調(diào)用在如下:eRo28資訊網(wǎng)——每日最新資訊28at.com

public class DefaultListableBeanFactory {  public void preInstantiateSingletons() {    for (String beanName : beanNames) {      // 創(chuàng)建單例bean      getBean(beanName);    }    // 單例bean創(chuàng)建完成以后,執(zhí)行afterSingletonsInstantiated回調(diào)方法    for (String beanName : beanNames) {      Object singletonInstance = getSingleton(beanName);      if (singletonInstance instanceof SmartInitializingSingleton smartSingleton) {        smartSingleton.afterSingletonsInstantiated();      }    }  }}

以上就不會在出現(xiàn)鎖問題。eRo28資訊網(wǎng)——每日最新資訊28at.com

2.2 解決方式2

升級Spring版本到Spring6.2(目前并沒有正式發(fā)布),你仍然可以使用6.2.0-SNAPSHOT版本,該版本通過多線程方式初始化Bean對象,這樣就不會出現(xiàn)deadlock問題。eRo28資訊網(wǎng)——每日最新資訊28at.com


eRo28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93206-0.html警惕!SpringBoot錯誤發(fā)布事件,造成死鎖Deadlock

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊 Mybatis 動態(tài) SQL

下一篇: 網(wǎng)易面試:SpringBoot如何開啟虛擬線程?

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
99视频有精品| 国产午夜精品久久久久久免费视| 毛片精品免费在线观看| 老司机精品视频网站| 欧美巨乳在线| 国产精品免费视频观看| 极品尤物久久久av免费看| 亚洲精品免费网站| 午夜视频一区| 欧美激情国产日韩精品一区18| 欧美高清免费| 国产精品亚洲综合一区在线观看 | 久久久夜夜夜| 欧美精品午夜| 国产一区二区三区四区hd| 亚洲人体1000| 久久爱www久久做| 欧美精品日韩综合在线| 国产欧美一级| 日韩亚洲欧美在线观看| 久久久精品国产免费观看同学| 欧美日韩国产区一| 国模精品一区二区三区色天香| 亚洲美女中文字幕| 久久久蜜桃精品| 国产精品久久久久免费a∨大胸 | 日韩亚洲一区在线播放| 欧美在线观看网站| 欧美日韩在线另类| 亚洲高清视频中文字幕| 欧美中文在线字幕| 欧美日韩国产欧美日美国产精品| 国产一区二区0| 宅男精品视频| 欧美freesex8一10精品| 国产欧美在线| 亚洲午夜精品一区二区| 欧美14一18处毛片| 国产一区二区三区不卡在线观看| 亚洲色图综合久久| 欧美大胆人体视频| 激情久久久久| 西西人体一区二区| 欧美性猛片xxxx免费看久爱| 亚洲丶国产丶欧美一区二区三区 | 在线亚洲欧美专区二区| 女同一区二区| 一区二区三区在线看| 欧美亚洲免费在线| 国产精品激情电影| 一区二区高清| 欧美老女人xx| 亚洲欧洲在线看| 久久亚洲二区| 好看不卡的中文字幕| 香蕉国产精品偷在线观看不卡| 欧美日韩中文字幕在线视频| 亚洲精品社区| 欧美成在线观看| 亚洲国产精品一区在线观看不卡| 久久久久久久久岛国免费| 国产精品一区久久久| 亚洲一区二区网站| 欧美色图首页| 一本大道久久a久久精品综合| 欧美激情精品久久久久久蜜臀 | 欧美网站在线| 妖精成人www高清在线观看| 欧美激情视频给我| 亚洲国产一区在线| 欧美不卡高清| 亚洲精品国产精品国自产在线| 免费欧美日韩| 亚洲欧洲精品一区二区三区波多野1战4 | 艳妇臀荡乳欲伦亚洲一区| 欧美欧美天天天天操| 亚洲精品欧美| 欧美精品18| 亚洲精选中文字幕| 欧美日韩国产丝袜另类| 一区二区成人精品| 欧美日韩一本到| 亚洲视频视频在线| 国产精品老女人精品视频| 亚洲一二三区在线| 国产精品一区=区| 欧美一区二区视频网站| 国产亚洲欧美日韩日本| 久久久久综合网| 狠狠色噜噜狠狠色综合久| 久久久久久亚洲综合影院红桃 | 在线观看日产精品| 欧美大片va欧美在线播放| 亚洲激情一区二区| 欧美精品在线一区| 中国亚洲黄色| 国产女主播一区| 久久久久久自在自线| 亚洲国产成人av好男人在线观看| 欧美.www| 亚洲一区二区在线播放| 国产视频观看一区| 久久婷婷影院| 亚洲美洲欧洲综合国产一区| 欧美午夜视频一区二区| 午夜一级在线看亚洲| 狠狠88综合久久久久综合网| 免费观看在线综合色| 亚洲日本激情| 国产精品欧美日韩一区二区| 欧美在线免费一级片| 亚洲动漫精品| 欧美特黄a级高清免费大片a级| 久久综合电影一区| 精品91久久久久| 欧美激情二区三区| 欧美人牲a欧美精品| 亚洲自拍偷拍网址| 好吊日精品视频| 欧美精品在线极品| 午夜精品区一区二区三| 1000部国产精品成人观看| 欧美日韩亚洲一区| 久久国产精品99久久久久久老狼| 亚洲电影观看| 国产精品视频自拍| 久久这里只有精品视频首页| 一本色道久久加勒比88综合| 国产日韩欧美视频在线| 欧美国产在线观看| 欧美亚洲日本网站| 亚洲欧洲精品一区| 国产欧美日韩一级| 欧美—级a级欧美特级ar全黄| 欧美一区2区视频在线观看| 亚洲欧洲三级| 国产亚洲成精品久久| 欧美—级高清免费播放| 久久精品99无色码中文字幕| 99精品国产福利在线观看免费 | 欧美天堂在线观看| 老巨人导航500精品| 亚洲天堂av电影| 在线观看视频一区二区| 国产精品毛片一区二区三区| 免费观看一级特黄欧美大片| 午夜精品理论片| 日韩一级网站| 影音先锋国产精品| 国产精品视频免费观看www| 欧美国产综合视频| 久久精品国产91精品亚洲| 中文日韩欧美| 亚洲激情图片小说视频| 国产专区欧美精品| 欧美视频中文在线看| 欧美3dxxxxhd| 久久精品夜色噜噜亚洲a∨| 在线亚洲+欧美+日本专区| 亚洲国产精品va| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲淫性视频| 亚洲清纯自拍| 影音先锋亚洲电影| 国产欧美日韩综合一区在线播放 | 欧美视频日韩视频| 欧美福利小视频| 久久久一区二区| 欧美亚洲专区| 亚洲欧美国产va在线影院| 99精品欧美| 亚洲国产成人午夜在线一区| 国产一区二区三区在线观看视频| 国产精品美女久久久久久久| 欧美日韩美女一区二区| 欧美国产专区| 欧美韩日视频| 欧美成人有码| 免费亚洲电影| 麻豆成人av| 蜜桃av一区二区| 老司机久久99久久精品播放免费| 欧美在线观看网站| 欧美在线网站| 欧美一级播放| 欧美一区二区三区日韩| 亚洲欧美亚洲| 亚洲欧美日韩天堂| 亚洲欧美bt| 午夜一区二区三区不卡视频| 亚洲尤物影院| 亚洲欧美日本国产专区一区| 亚洲午夜羞羞片| 亚洲一区二区三区精品视频| 中国日韩欧美久久久久久久久| 中文久久精品| 亚洲免费一区二区| 欧美亚洲系列| 久久精品国产综合精品| 久久久久久久波多野高潮日日 | 99re6这里只有精品| 亚洲美女精品一区| 99视频热这里只有精品免费| 日韩一区二区精品葵司在线|