Vorwort
Vor kurzem habe ich beim Start des Frühlingsprojekts auf ein Deadlock -Problem gestoßen. Wenn Sie JStack verwenden, um den Thread -Stapel zu erhalten, können Sie Deadlocks auf zwei Threads sehen:
Lösungsprozess:
Der Quellcode von DefaultSingletonBeanRegistry.getSingleton() ist wie folgt. Sie können sehen, dass diese Methode die Sperrung der SingletonObjects erfordert.
Der Quellcode des zweiten xxx.subject.core.cache.datalocalcacheinit.afterPropertieStieStset ist wie folgt:
Sie können sehen, dass diese Bean initialisiert wird, startet sie den Thread und ruft initData() -Methode einer anderen Bean auf, um Daten aus der Datenbank zu laden. Die Initialisierung der DatalocalCacheinit -Bean wird nach dem Laden der Daten als vollständig angesehen.
Aus dem obigen Stapel können wir sehen, dass der Federbehälter die Bohne das SingletonObjects -Objekt sperrt; Wir öffnen einen Faden in afterPropertiesSet() , die schließlich die Feder zum Laden einer anderen Bohne auslöst. Der erste Faden (der Hauptfaden, der die Feder initialisiert) hat das Schloss nicht freigegeben, und der zweite Faden (der von sich selbst geöffnete Faden) muss auch die SingletonObjects -Objektschloss erhalten, die einen Deadlock verursacht. Das gezeigte Phänomen ist, dass der Federbehälter dort steckt und die Initialisierung aller Bohnen nicht vervollständigen kann.
Schauen wir uns ein Beispiel an, das dem tatsächlichen Code in unserem Projekt sehr ähnlich ist. FirstBean nennt die Methode in Confighelper:
öffentliche Klasse FirstBean implementiert Initialisierungsbean {@Override public void AfterPertieStieSet () löst Ausnahme aus {System.out.println ("Erste Bean initialisieren ...."); Blockingqueue -Warteschlange = NeuarrayBlockingCocksQueue (10); Thread thread = new Thread () {@Override public void run () {confighelper.dosomething (); queue.add (1); }}; Thread.Start (); queue.take (); System.out.println ("Zuerst Daten erhalten ...."); }} Der Confighelper -Code lautet wie folgt: Holen Sie sich eine weitere Bohne durch Beanfaktor
Public Class Confighelper implementiert Beanfactoryaware {private statische Beanfactory Factory; @Override public void setbeanFactory (beanfactory beanfactory) löst Beansexception {this.factory = beanfactory aus; } public static void dosomething () {SecondBean Bean = (zweite) factory.getBean ("Second"); bean.say (); }} Der zweite Code ist einfach wie folgt:
public class SecondBean {public void say () {System.out.println ("SecondBean ..."); }}Die Frühlingskonfigurationsdatei und der Startcode sind wie folgt. Sie können beim Laufen Deadlocks finden:
<? XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" </beans> public class main {public static void main (String [] args) {applicationContext context = new FileSystemXMLApplicationContext ("src/main/java/net/aty/fing/tödlich/ladlock.xml"); // Spring -Konfiguration Datei}}}}}}}}}}}}}}}}}Wenn die Frühling initialisiert wird, starten wir den Faden, um die Bohne an einigen Verlängerungspunkten von Spring (BeanfactoryAware/Initialisierungsbean usw.) zu erwerben, der Container wird abgestimmt. Da Spring Singleton -Bohnen (die meisten Bohnen sind Singletons) initialisiert. Wenn das Schloss nicht freigegeben wurde, wenn 1 Bohne initialisiert wird und ein weiterer Faden die Federbeladungsbohne auslöst, wird ein Deadlock angezeigt.
Das Lösen des obigen Problems ist einfach: FirstBean hängt logischerweise von Confighelper und Secondbean ab, aber wir zeigen nicht die logische Beziehung des Frühlings. Wenn die Spring FirstBean initialisiert, geben Sie afterPropertiesSet() ein. Diese Methode löst das Laden der anderen 2 Bohnen aus, wenn der Faden eingeschaltet ist. Wir müssen nur die Abhängigkeit von Frühling zeigen und zuerst die Federbelastung bekiefern lassen.
<bean id = "config" abhängig auf = "zweite"> </bean> <bean id = "First" Abhängig von "Konfiguration"> </bean> <bean id = "Second"> </bean>
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.