Jalan buntu
Screw adalah alat yang sangat berguna dengan banyak aplikasi karena sangat mudah digunakan dan mudah dimengerti. Tetapi pada saat yang sama, itu juga akan membawa beberapa masalah, yaitu, dapat menyebabkan kebuntuan. Setelah kebuntuan terjadi, fungsi sistem tidak akan tersedia. Pertama -tama mari kita lihat sepotong kode, yang akan menyebabkan kebuntuan, menyebabkan thread thread_1 dan thread thread_2 untuk menunggu satu sama lain untuk melepaskan kunci.
package thread;public class DeadLockDemo {private static String A = "A";private static String B = "B";public static void main(String args[]) {new DeadLockDemo().deadLock();}private void deadLock() {// thread thread_1 Thread thread_1 = new Thread(new Runnable() {@Override public void run() {synchronized (A) {System.err.println("--thread_1 lock A----");synchronized (B) {System.err.println("--thread_1 lock B----");}}}});// Thread thread_2 Thread thread_2 = new Thread(new Runnable() {@Override public void run() {synchronized (B) {System.out.println ("-Thread_2 Lock B -----"); disinkronkan (a) {System.out.println ("-Thread_2 Lock a ----");}}}}); thread_1.start (); thread_2.start ();}}}}Kode ini hanyalah demonstrasi skenario kebuntuan, dan pada kenyataannya Anda mungkin tidak menulis kode tersebut. Tetapi dalam beberapa skenario yang lebih kompleks, Anda mungkin mengalami masalah seperti itu, seperti Thread_1 belum merilis kabel karena beberapa situasi abnormal (loop dead). Atau thread_1 mendapat kabel basis data, dan pengecualian dilemparkan saat melepaskan kunci, tetapi tidak dilepaskan.
Setelah kebuntuan terjadi, bisnis ini terlihat karena layanan tidak dapat disediakan. Kemudian Anda hanya dapat memeriksa utas mana yang memiliki masalah melalui utas dump. Informasi utas berikut memberi tahu kita bahwa baris 35 dan 21 dari kelas DeadlockDemo menyebabkan kebuntuan.
"Thread -1" prio = 6 tid = 0x000000000cb13800 nid = 0x19ac Menunggu entri monitor [0 x000000000d67f000] java.lang.thread.state: diblokir (pada monitor objek) di thread.deadlockdemo $ 2.run (dadllockdemo.java:3) -0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 java.lang.string) - terkunci <0x00000007d5a9beb8> (a java.lang.string) di java.lang.thread.run (sumber yang tidak diketahui) "thread -0" prio = 6 tid = 0x000000cb0e800 nid = 0x6bc Menunggu monitor = 0x000000cb0e800 nid = 0x6bc Menunggu monitor untuk monitor [ENTERN0000CB0E800 NID = 0x6bc untuk monitor = 0x000000CB0E800 NID = 0x6bc untuk Monitor = 0x000000CB0E800 NID = 0x6bc untuk Monitor = 0x00000000CB0E800 NID = 0x6bc untuk Monitor untuk Monitor (ETNERSION000000CB0E800) java.lang.thread.state: diblokir (pada monitor objek) di thread.deadlockdemo $ 1.run (deadlockdemo.java:21) - menunggu untuk mengunci <0x00000007d5a9beb8> (a java.lang.string) - terkunci <0x00000007d57d5be9) (A Java.Lang) - terkunci <0x00000007d57d5e9) (A Java.Lang) - terkunci <0x00000007d57d5be8. java.lang.thread.run (sumber yang tidak diketahui)
Beberapa cara umum untuk menghindari kebuntuan.
Hindari memperoleh beberapa kunci bersamaan dengan utas.
Hindari satu utas yang menempati banyak sumber daya pada saat yang sama di tali, dan cobalah untuk memastikan bahwa setiap tali hanya mengkonsumsi satu sumber daya.
Coba gunakan pencarian waktunya, gunakan lock.trylock (timeout) alih -alih menggunakan mekanisme pencarian internal.
Untuk kabel basis data, penguncian dan pembukaan harus ada dalam koneksi database, jika tidak membuka kunci akan gagal.
referensi:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
Meringkaskan
Di atas adalah analisis kode lengkap dari metode umum Java untuk menghindari kebuntuan dalam artikel ini. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!