Java Thread Prioritas <BR /> Jenis kesalahan khusus yang terkait dengan multitasking yang perlu dihindari adalah kebuntuan. Kebuntuan terjadi ketika dua utas memiliki ketergantungan melingkar pada sepasang objek sinkron. Misalnya, misalkan satu utas memasuki pipa objek X dan utas lain memasuki pipa objek Y. Jika utas X mencoba memanggil metode sinkronisasi Y, itu akan dikunci seperti yang diharapkan. Utas Y juga ingin memanggil beberapa metode sinkronisasi X, dan utasnya menunggu selamanya, karena untuk mencapai X, ia harus melepaskan kunci Y sendiri untuk membuat utas pertama lengkap. Deadlock adalah kesalahan yang sangat sulit untuk debug karena:
Biasanya, itu jarang terjadi, dan itu hanya terjadi ketika periode waktu kedua utas hanya cocok.
Ini mungkin berisi lebih dari dua utas dan objek sinkron (yaitu, kebuntuan dapat terjadi ketika ada urutan peristiwa yang lebih kompleks daripada contoh yang baru saja dijelaskan).
Untuk sepenuhnya memahami kebuntuan, penting untuk mengamati perilakunya. Contoh berikut menghasilkan dua kelas, A dan B, dengan metode FOO () dan BAR () masing -masing. Kedua metode ini memiliki jeda singkat sebelum memanggil metode kelas lain. Kelas utama, bernama Deadlock, menciptakan contoh A dan B, dan kemudian memulai utas kedua untuk mengatur lingkungan kebuntuan. Metode foo () dan bar () menggunakan tidur () untuk memaksa kebuntuan.
// Contoh deadlock.class a {disinkronkan void foo (b b) {string name = thread.currentThread (). GetName (); Thread .sleep (1000); ();} Sinkronisasi void last () {System.out.println ("Inside A.Last"); System .out.println (nama + "dimasukkan B.Bar"); n (name + "mencoba untuk memanggil a.last ()"); {A = A New (); (); Dapatkan kunci B di utas lain. Setelah menjalankan program, outputnya adalah sebagai berikut:
MainThread memasuki A.FooracingThread memasuki B.BarmainThread mencoba memanggil B.Last () RacingThread mencoba memanggil a.last ()
Karena program ini menemui jalan buntu, Anda perlu menekan Ctrl-C untuk mengakhiri program. Tekan Ctrl-Break pada PC (atau tekan Ctrl-/ di bawah Solaris) dan Anda dapat melihat utas penuh dan tumpukan buffer pipa. Anda akan melihat bahwa RacingThread menempati proses manajemen B sambil menunggu proses manajemen A, dan pada saat yang sama, MainThread menempati A menunggu proses manajemen b. Program tidak akan pernah berakhir. Seperti yang diilustrasikan contoh ini, program multithreaded Anda sering dikunci, dan kebuntuan adalah masalah pertama yang harus Anda periksa.
Java Thread Deadlock <BR /> Jenis kesalahan khusus yang terkait dengan multitasking yang perlu dihindari adalah kebuntuan. Kebuntuan terjadi ketika dua utas memiliki ketergantungan melingkar pada sepasang objek sinkron. Misalnya, misalkan satu utas memasuki pipa objek X dan utas lain memasuki pipa objek Y. Jika utas X mencoba memanggil metode sinkronisasi Y, itu akan dikunci seperti yang diharapkan. Utas Y juga ingin memanggil beberapa metode sinkronisasi X, dan utasnya menunggu selamanya, karena untuk mencapai X, ia harus melepaskan kunci Y sendiri untuk membuat utas pertama lengkap. Deadlock adalah kesalahan yang sangat sulit untuk debug karena:
Biasanya, itu jarang terjadi, dan itu hanya terjadi ketika periode waktu kedua utas hanya cocok.
Ini mungkin berisi lebih dari dua utas dan objek sinkron (yaitu, kebuntuan dapat terjadi ketika ada urutan peristiwa yang lebih kompleks daripada contoh yang baru saja dijelaskan).
Untuk sepenuhnya memahami kebuntuan, penting untuk mengamati perilakunya. Contoh berikut menghasilkan dua kelas, A dan B, dengan metode FOO () dan BAR () masing -masing. Kedua metode ini memiliki jeda singkat sebelum memanggil metode kelas lain. Kelas utama, bernama Deadlock, menciptakan contoh A dan B, dan kemudian memulai utas kedua untuk mengatur lingkungan kebuntuan. Metode foo () dan bar () menggunakan tidur () untuk memaksa kebuntuan.
// Contoh deadlock.class a {disinkronkan void foo (b b) {string name = thread.currentThread (). GetName (); Thread .sleep (1000); ();} Sinkronisasi void last () {System.out.println ("Inside A.Last"); System .out.println (nama + "dimasukkan B.Bar"); n (name + "mencoba untuk memanggil a.last ()"); {A = A New (); (); Dapatkan kunci B di utas lain. Setelah menjalankan program, outputnya adalah sebagai berikut:
MainThread memasuki A.FooracingThread memasuki B.BarmainThread mencoba memanggil B.Last () RacingThread mencoba memanggil a.last ()
Karena program ini menemui jalan buntu, Anda perlu menekan Ctrl-C untuk mengakhiri program. Tekan Ctrl-Break pada PC (atau tekan Ctrl-/ di bawah Solaris) dan Anda dapat melihat utas penuh dan tumpukan buffer pipa. Anda akan melihat bahwa RacingThread menempati proses manajemen B sambil menunggu proses manajemen A, dan pada saat yang sama, MainThread menempati menunggu proses manajemen b. Program tidak akan pernah berakhir. Seperti yang diilustrasikan contoh ini, program multithreaded Anda sering dikunci, dan kebuntuan adalah masalah pertama yang harus Anda periksa.