Prefácio
Recentemente, encontrei um problema de impasse ao iniciar o projeto da primavera. Ao usar o JSTack para obter a pilha de threads, você pode ver que dois tópicos têm deadlocks:
Processo de solução:
O código -fonte de DefaultSingletonBeanRegistry.getSingleton() é o seguinte. Você pode ver que esse método exige que os objetivos singleton sejam bloqueados.
O código -fonte do segundo xxx.subject.core.cache.datalocalcacheinit.afterpropertiesset é o seguinte:
Você pode ver que, quando este feijão for inicializado, ele iniciará o thread e chamará initData() de outro feijão para carregar dados do banco de dados. A inicialização do feijão DatalocalCacheInit será considerada completa após a carga dos dados.
Na pilha acima, podemos ver que, quando o contêiner de mola inicializar o feijão, ele bloqueará o objeto SingletonObjects; Abrimos um thread no método afterPropertiesSet() , que acabará por acionar a mola para carregar outro feijão. O primeiro thread (o encadeamento principal que inicializa a mola) não soltou o bloqueio e o segundo encadeamento (o encadeamento que é aberto por si só) também precisa obter o bloqueio do objeto SingletonObjects, que causa um impasse. O fenômeno mostrado é que o recipiente de mola está preso lá e não pode concluir a inicialização de todos os grãos.
Vamos dar uma olhada em um exemplo, o que é muito semelhante ao código real em nosso projeto. FirstBean chama o método em Confighelper:
public class FirstBean implementa InitializandoBean {@Override public void depoisPropertiEsset () lança a exceção {System.out.println ("First Bean está inicializando ...."); Fila de blockingQueue = novo ArrayBlockingQueue (10); Thread Thread = new Thread () {@Override public void run () {Confighelper.dosomething (); fila.add (1); }}; thread.start (); fila.take (); System.out.println ("primeiro dados de obtenha ..."); }} O código do Confighelper é o seguinte: Obtenha outro feijão através do BeanFactory
classe pública Confighelper implementa BeanFactoryAWare {fábrica privada de feijão estático; @Override public void setBeanFactory (BeanFactory BeanFactory) lança beansexception {this.factory = beanFactory; } public static void Dosomething () {SecondBean Bean = (SecondBean) Factory.getBean ("Second"); bean.say (); }} O código SecondBean é simples da seguinte maneira:
public class SecondBean {public void Say () {System.out.println ("SecondBean ..."); }}O arquivo de configuração da mola e o código de inicialização são os seguintes. Você pode encontrar deadlocks ao correr:
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <Bean Id = "Config"> </bean id = "Second"> </ Bean> </ Beans> classe pública Main {public static void main (string [] args) {ApplicationContext context = new FileSystemXMLApplicationContext ("src/main/java/net/aty/spring/deadlock/deadlock.xml") // Carregar Spring ConfigurandoQuando a primavera for inicializada, se iniciarmos o thread para adquirir o feijão em alguns pontos de extensão fornecidos pela primavera (BeanFactoryAware/InitializingBean, etc.), o contêiner será implementado. Porque a primavera inicializa o feijão singleton (a maioria dos feijões é singletons) adicionará bloqueios. Se o bloqueio não tiver sido liberado quando 1 Bean for inicializado e outro fio desencadeia o feijão de carga de mola novamente, um impasse aparecerá.
Resolver o problema acima é simples: o FirstBean depende logicamente do Confighelper e do SecondBean, mas não mostramos a relação lógica da primavera. Quando a primavera inicializa o FirstBean, digite afterPropertiesSet() . Este método acionará o carregamento dos outros 2 feijões quando a rosca estiver ligada. Só precisamos mostrar a dependência da primavera e deixar o Spring Load Confighelper e o SecondBean primeiro.
<bean id = "config" depende-one = "segundo"> </shean> <bean id = "primeiro" depende-em
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.