Предисловие
Недавно я столкнулся с проблемой тупика при запуске весеннего проекта. При использовании JStack для получения стека потоков вы можете видеть, что у двух потоков есть тупики:
Процесс решения:
Источник исходного кода DefaultSingletonBeanRegistry.getSingleton() умолчанию. Вы можете видеть, что этот метод требует, чтобы одновременные объятия были заблокированы.
Исходный код второго xxx.subject.core.cache.datalocalcacheinit.afterpropertiesset выглядит следующим образом:
Вы можете видеть, что когда этот боб будет инициализирован, он запустит поток и вызовет метод initData() другой бобов для загрузки данных из базы данных. Инициализация бобов DataLocalCacheinit будет считаться полной после загрузки данных.
Из приведенного выше стека мы видим, что когда пружинный контейнер инициализирует бобы, он заблокирует объект SingletonObjects; Мы открываем поток в методе afterPropertiesSet() , который в конечном итоге запустит пружину для загрузки еще одной бобов. Первый поток (основной поток, который инициализирует Spring), не выпустил блокировку, а второй поток (поток, который открывается сам по себе) также должен получить блокировку объекта SingletonObjects, что вызывает тупик. Показанное явление состоит в том, что пружинный контейнер застрял там и не может завершить инициализацию всех бобов.
Давайте посмотрим на пример, который очень похож на фактический код в нашем проекте. Первый массив вызывает метод в Confighelper:
Public Class FirstBean реализует инициализацию Bean {@Override public void ampoperpertiesset () выбрасывает exection {system.out.println («Первый бон инициализируется ....»); Queue Blockingueue = новый ArrayBlockingQueue (10); Thread Think = new Thread () {@Override public void run () {confighelper.dosomething (); queue.add (1); }}; Thread.Start (); queue.take (); System.out.println («Сначала получить данные ....»); }} Код Confighelper выглядит следующим образом: Получите еще одну боб через Beanfactory
Public Class Confighelper реализует BeanFactoryAware {Private Static BeanFactory Factory; @Override public void setbeanFactory (beanfactory beanfactory) бросает Beansexception {this.factory = beanfactory; } public static void dosomething () {второй бон = (второй бассейн) factory.getbean ("second"); bean.say (); }} Код второго взрыва прост следующим образом:
открытый класс второй бассейн {public void say () {System.out.println ("Второе суть ..."); }}Файл конфигурации пружины и код запуска следующие. Вы можете найти тупики при запуске:
<? 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"></bean> <bean id="first"></bean> <bean id="second"></bean> </beans> public Class main {public static void main (string [] args) {applicateContext context = new FileStemXmlApplicationContext ("src/main/java/net/aty/spring/deadlock/deadlock.xml"); // файл загрузки пружины}}Когда пружина инициализируется, если мы запустим потоку, чтобы приобрести фасоль в некоторых точках расширения, предоставленных весной (BeanFactoryAware/инициализация и т. Д.), Контейнер будет запущен. Поскольку весна инициализирует синглтонские бобы (большинство бобов являются синглтонами) добавят замки. Если замок не был выпущен при инициализировании 1 фасоля, а другая резьба снова запускает пружинный загрузочный фасоль, появится тупик.
Решение вышеупомянутой проблемы просто: первое логически зависит от конфегов и второго бобов, но мы не показываем логические отношения весны. Когда пружина инициализирует FirstBean, введите afterPropertiesSet() . Этот метод запустит загрузку других двух бобов при включении потока. Нам просто нужно показать зависимость от пружины и сначала позволить конфугелперу с пружиной и вторым.
<bean id = "config" зависит-on = "второе"> </bean> <bean id = "first" зависит от = "config"> </bean> <bean id = "second"> </bean>
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.