老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

如何解決spring容器初始化遇到的死鎖問題-創新互聯

小編給大家分享一下如何解決spring容器初始化遇到的死鎖問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創新互聯服務項目包括神池網站建設、神池網站制作、神池網頁制作以及神池網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,神池網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到神池省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!

前言

最近啟動spring項目的時候遇到一個死鎖問題,使用jstack獲取線程堆棧的時候,可以看到2個線程出現了死鎖:

如何解決spring容器初始化遇到的死鎖問題

解決過程:

DefaultSingletonBeanRegistry.getSingleton()源碼如下,可以看到這個方法需要對singletonObjects加鎖

如何解決spring容器初始化遇到的死鎖問題

第二處xxx.subject.core.cache.DataLocalcacheInit.afterPropertiesSet源碼如下:

如何解決spring容器初始化遇到的死鎖問題

可以看到:這個bean在初始化的時候,會開啟線程,調用另外一個bean的initData()方法從數據庫加載數據。等數據加載完畢,DataLocalcacheInit這個bean的初始化才算完成。

通過上面的堆??梢钥闯觯簊pring容器在初始化bean的時候,會對singletonObjects對象加鎖;我們自己在afterPropertiesSet()方法中開啟了一個線程,最終也會觸發spring加載另外的bean。第一個線程(初始化spring的main線程)還沒有釋放鎖,第二個線程(自己開啟的線程),也需要獲取singletonObjects對象鎖,這樣就出現了死鎖。表現出來的現象就是:spring容器卡在那里,不能完成所有bean的初始化。

來看一段例子,這個例子和我們項目中實際代碼很相似。FirstBean調用ConfigHelper中的方法:

public class FirstBean implements InitializingBean {
 
 @Override
 public void afterPropertiesSet() throws Exception {
  System.out.println("first bean is initializing....");
 
  BlockingQueue queue = new ArrayBlockingQueue(10);
  Thread thread = new Thread() {
 
   @Override
   public void run() {
    ConfigHelper.doSomething();
    queue.add(1);
   }
  };
 
  thread.start();
 
  queue.take();
  System.out.println("first get data....");
 
 }
}

ConfigHelper代碼如下:通過BeanFactory獲取到另外一個bean

public class ConfigHelper implements BeanFactoryAware {
 private static BeanFactory factory;
 
 @Override
 public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  this.factory = beanFactory;
 }
 
 public static void doSomething()
 {
  SecondBean bean = (SecondBean)factory.getBean("second");
  bean.say();
 }
}

SecondBean代碼很簡單如下:

public class SecondBean {
 public void say() {
  System.out.println("SecondBean....");
 }
}

spring配置文件和啟動代碼如下,運行可以發現出現死鎖:



 
 
 
 
 
 

public class Main {
 public static void main(String[] args) {
  ApplicationContext context = new FileSystemXmlApplicationContext(
    "src/main/java/net/aty/spring/deadlock/deadlock.xml");// 加載 spring 配置文件
 
 }
}

如何解決spring容器初始化遇到的死鎖問題

spring初始化的時候,如果我們在spring提供的一些擴展點處(BeanFactoryAware/InitializingBean等),開啟線程去獲取bean,很容器出現死鎖。因為spring初始化單例bean(大多數bean都是單例的)會加鎖。如果初始化1個bean的時候,還沒有釋放鎖,另一個線程再次觸發spring加載bean,就會出現死鎖。

解決上面的問題很簡單:FirstBean邏輯上是依賴于ConfigHelper和SecondBean的,但是我們卻并沒有顯示地告訴spring這種邏輯關系。spring初始化FirstBean的時候,進入afterPropertiesSet() ,這個方法開啟了線程會觸發另外2個bean的加載。我們只要顯示地告訴spring這種依賴關系,讓spring先加載ConfigHelper和SecondBean就可以了。



如何解決spring容器初始化遇到的死鎖問題

以上是“如何解決spring容器初始化遇到的死鎖問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!


分享題目:如何解決spring容器初始化遇到的死鎖問題-創新互聯
轉載來于:http://www.xueling.net.cn/article/ceiepe.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 包青天1一236集在线高清天寒 | 热久久综合网 | 国产在线观看成人 | 熟妇高潮一区二区三区 | 韩国三级丰满少妇高潮 | 我和岳在厨房里做中文字幕 | 亚洲AV无码片区一区二区三区 | 国产精品久久久久久久久快鸭 | 九九精品视频在线观看 | 午夜刺激爽爽视频免费观看 | 久久精品免费播放 | 夜夜高潮夜夜爽夜夜爱 | 亚洲欧美一区二区三区视频 | 一区二区三区香蕉视频 | 亚洲国产福利一区二区三区 | 超碰91在线播放 | 欧美暖暖视频 | 99久久夜色精品国产网站 | 国产激情久久久久影院小草 | 中文字幕另类日韩欧美亚洲嫩草 | 国产精品中文字幕在线观看 | 亚洲欧美国产成人久久 | 国产国语毛片 | 日本特级黄 | 日日摸日日碰夜夜爽无 | 欧美丰满熟妇XXXX性多毛 | 欧美激情视频一区二区三区 | 色综合久久久久久久久久久 | 牛牛视频一区二区三区 | 国产成人精品亚洲 | 日韩精品无码一区二区视频 | 国产精品一区二区av麻豆 | 国产成人精品一区二区在线小狼 | 日本毛片免费看 | 色婷婷亚洲 | av色蜜桃一区二区三区 | 国产手机精品一区二区 | 综合网视频 | 69堂官网| 91在线观看免费视频 | 6080YYY午夜理论片 |