一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - spring容器初始化遇到的死鎖問題解決

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

2021-05-13 11:24aitangyong Java教程

這篇文章主要給大家介紹了關于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中的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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代碼很簡單如下:

?
1
2
3
4
5
public class secondbean {
 public void say() {
  system.out.println("secondbean....");
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  xsi:schemalocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
 
 
 <bean id="config" class="net.aty.spring.deadlock.confighelper"></bean>
 <bean id="first" class="net.aty.spring.deadlock.firstbean"></bean>
 <bean id="second" class="net.aty.spring.deadlock.secondbean"></bean>
 
</beans>
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就可以了。

?
1
2
3
<bean id="config" class="net.aty.spring.deadlock.confighelper" depends-on="second"></bean>
<bean id="first" class="net.aty.spring.deadlock.firstbean" depends-on="config"></bean>
<bean id="second" class="net.aty.spring.deadlock.secondbean"></bean>

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://blog.csdn.net/aitangyong/article/details/53036913

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品亚洲一区二区三区在线播放 | 国产成人综合亚洲亚洲欧美 | 91精品综合国产在线观看 | 美女mm131爽爽爽久久 | 韩剧在线观看 | 免费在线观看成年人视频 | 亚洲成熟人网站 | 办公室操秘书 | 成人午夜视频一区二区国语 | 天堂8在线天堂资源bt | 日本免费v片一二三区 | 精品欧美一区二区三区在线观看 | 青青青久在线视频免费观看 | 欧美精品一区二区在线观看播放 | youjizzxxx69日本| 日韩欧美一区二区三区免费观看 | 亚洲精品97福利在线 | 国产精品最新 | 欧美在线视频7777kkkk | 国产小情侣自拍 | 1986葫芦兄弟全集免费观看第十集 | 欧美国产日本高清不卡 | 国产亚洲精品视频中文字幕 | 苍井空av | 国内精品国语自产拍在线观看55 | 日本68xxxxxxxxx24 日本 片 成人 在线 | 亚洲六月丁香六月婷婷蜜芽 | 色999| 6080伦理久久精品亚洲 | 色老头综合网 | 色戒完整版2小时38分钟 | 鸥美毛片 | 亚洲 日韩 国产 制服 在线 | 91视频国产精品 | 男女xxoo做爰猛烈动态一 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲毛片免费看 | 亚洲天堂精品在线 | 2022av小四郎的最新地址 | 天海翼最新 | 国内在线播放 |