Kata pengantar
Baru -baru ini, saya mengalami masalah kebuntuan saat memulai proyek musim semi. Saat menggunakan JStack untuk mendapatkan tumpukan utas, Anda dapat melihat bahwa dua utas memiliki kebuntuan:
Proses Solusi:
Kode Sumber DefaultSingletonBeanRegistry.getSingleton() adalah sebagai berikut. Anda dapat melihat bahwa metode ini membutuhkan singletonObjects untuk dikunci.
Kode sumber dari xxx.subject.core.cache.cache.cature.cactalcacheit.afterpropertiesset kedua kedua adalah sebagai berikut:
Anda dapat melihat bahwa ketika kacang ini diinisialisasi, ia akan memulai utas dan memanggil metode initData() dari kacang lain untuk memuat data dari database. Inisialisasi kacang datalocalcacheinit akan dianggap lengkap setelah data dimuat.
Dari tumpukan di atas, kita dapat melihat bahwa ketika wadah pegas menginisialisasi kacang, itu akan mengunci objek SingletOnObjects; Kami membuka utas dalam metode afterPropertiesSet() , yang pada akhirnya akan memicu pegas untuk memuat kacang lain. Utas pertama (utas utama yang menginisialisasi pegas) belum merilis kunci, dan utas kedua (utas yang dibuka dengan sendirinya) juga perlu mendapatkan kunci objek SingletonObjects, yang menyebabkan kebuntuan. Fenomena yang ditunjukkan adalah bahwa wadah pegas macet di sana dan tidak dapat menyelesaikan inisialisasi semua kacang.
Mari kita lihat contoh, yang sangat mirip dengan kode aktual dalam proyek kami. FirstBean memanggil metode ini di Confighelper:
kelas publik firstBean mengimplementasikan inisialisasi {@override public void afterpropertiesset () melempar Exception {System.out.println ("Bean pertama diinisialisasi ...."); BlockingQueue Queue = ArrayBlockingQueue baru (10); Thread thread = thread baru () {@Override public void run () {confighelper.dosomething (); Queue.add (1); }}; thread.start (); antrian.take (); System.out.println ("Pertama dapatkan data ...."); }} Kode confighelper adalah sebagai berikut: Dapatkan kacang lain melalui beanfactory
Kelas Publik Confighelper mengimplementasikan BeanfactoryAware {Private Static Beanfactory Factory; @Override public void setBeanFactory (beanfactory beanfactory) melempar beansexception {this.factory = beanfactory; } public static void dosomething () {secondbean bean = (secondbean) factory.getBean ("kedua"); bean.say (); }} Kode kedua sederhana sebagai berikut:
kelas publik secondbean {public void say () {System.out.println ("Kedua ..."); }}File konfigurasi pegas dan kode startup adalah sebagai berikut. Anda dapat menemukan kebuntuan saat berlari:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls 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> kelas publik utama {public static void main (string [] args) {applicationContext context = new FilesyStemXMLapPlicationContext ("src/main/java/net/aty/spring/deadlock/deadlock.xml"); // memuat file konfigurasi pegas}}}Ketika musim semi diinisialisasi, jika kita memulai utas untuk memperoleh kacang pada beberapa titik ekstensi yang disediakan oleh Spring (BeanfactoryAware/InitializingBean, dll.), Wadah akan menemui jalan buntu. Karena musim semi menginisialisasi kacang singleton (sebagian besar kacang singleton) akan menambah kunci. Jika kunci belum dirilis ketika 1 kacang diinisialisasi, dan utas lain memicu kacang pemuatan pegas lagi, kebuntuan akan muncul.
Memecahkan masalah di atas adalah sederhana: firstbean secara logis tergantung pada confighelper dan secondbean, tetapi kami tidak menunjukkan hubungan logis musim semi. Saat musim semi menginisialisasi firstbean, masukkan afterPropertiesSet() . Metode ini akan memicu pemuatan 2 kacang lainnya saat utas dihidupkan. Kita hanya perlu menunjukkan ketergantungan pegas dan membiarkan Spring Load Confighelper dan Secondbean terlebih dahulu.
<bean id = "config" tergantung-on = "kedua"> </ bean> <bean id = "first" tergantung-on = "config"> </ bean> <bean id = "kedua"> </ bean>
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.