Banyak pertanyaan wawancara inti Java berasal dari kerangka kerja multi-threading dan koleksi. Pengalaman praktis yang mahir diperlukan saat memahami konsep utas inti. Artikel ini mengumpulkan beberapa pertanyaan khas tentang Threading Java, yang sering ditanyakan oleh insinyur senior.
0. Apa itu sinkronisasi multi-threaded di java?
Di bawah program multi-threaded, sinkronisasi dapat mengontrol akses ke sumber daya bersama. Jika tidak ada sinkronisasi, ketika utas Java memodifikasi variabel bersama, utas lain menggunakan atau memperbarui variabel yang sama, yang dapat dengan mudah menyebabkan hasil yang salah dalam program.
1. Jelaskan beberapa cara untuk mengimplementasikan multi-threading?
Utas Java dapat mengimplementasikan antarmuka yang dapat dijalankan atau mewarisi kelas utas untuk mengimplementasikannya. Ketika Anda berencana untuk mewarisi beberapa kali, Anda akan lebih suka menerapkan Runnable.
2. Apa perbedaan antara thread.start () dan thread.run ()?
Metode thread.start () (asli) memulai utas dan memasuki keadaan siap. Ketika CPU mengalokasikan waktu ke utas, JVM menjadwalkan untuk menjalankan metode run ().
3. Mengapa kita membutuhkan metode run () dan start ()? Bisakah kita menggunakan metode run () untuk menyelesaikan tugas?
Kami membutuhkan dua metode run () & start () karena JVM membuat utas terpisah berbeda dari panggilan metode biasa, sehingga pekerjaan ini dilakukan dengan metode start utas. Mulai diimplementasikan oleh metode lokal dan perlu disebut dapat ditampilkan. Keuntungan lain dari menggunakan kedua metode ini adalah bahwa objek apa pun dapat dijalankan sebagai utas. Selama antarmuka yang dapat diimplementasikan, ini menghindari masalah warisan java yang disebabkan oleh mewarisi kelas utas.
4. Apa kelas threadlocal dan bagaimana menggunakannya?
ThreadLocal adalah variabel lokal tingkat utas, bukan "utas lokal". ThreadLocal menyediakan salinan independen dari variabel untuk setiap utas yang menggunakan variabel. Setiap utas tidak mempengaruhi salinan objek utas lainnya saat memodifikasi salinan (catatan penerjemah).
Berikut adalah poin -poin utama dari variabel lokal utas:
Variabel lokal utas (variabel threadlocal) dengan mudah menyediakan variabel terpisah untuk setiap utas.
Instance Threadlocal biasanya muncul di kelas sebagai bidang privat (statis pribadi) statis, yang digunakan untuk mengaitkan utas.
Saat beberapa utas akses threadlocal instance, setiap utas memelihara salinan independen dari variabel yang disediakan oleh Threadlocal.
Penggunaan yang umum digunakan dapat dilihat dalam mode DAO. Ketika kelas DAO adalah kelas singleton, koneksi database dipelihara secara independen oleh masing -masing utas dan tidak saling mempengaruhi. (Singleton berdasarkan utas)
5. Kapan InvalidmonitorStateException akan dilemparkan dan mengapa?
Saat memanggil salah satu metode dalam tunggu ()/notify ()/notifyAll (), jika utas saat ini tidak mendapatkan kunci objek, pengecualian ilegalmonitorStateException akan dilemparkan (yaitu, ketika program tidak menjalankan blok sinkronisasi atau metode sinkronisasi objek, masih mencoba menelepon ()/tidak ada (). Karena pengecualian adalah subclass dari runtimeExcpetion, pengecualian tidak harus ditangkap (meskipun Anda dapat menangkapnya selama yang Anda inginkan). Sebagai runtimeException, pengecualian seperti itu tidak disebutkan dalam tandatangan metode tunggu (), notify (), notifyall ().
6. Apa perbedaan antara tidur (), suspend () dan tunggu ()?
Thread.sleep () membuat utas saat ini dalam keadaan "tidak dapat dijalankan" pada waktu yang ditentukan. Benang selalu memegang monitor objek. Misalnya, jika utas saat ini berada di blok sinkronisasi atau metode sinkronisasi, utas lain tidak dapat memasukkan blok atau metode. Jika utas lain memanggil metode interrupt (), itu akan membangunkan utas "tidur" itu.
Catatan: Sleep () adalah metode statis. Ini berarti bahwa itu hanya valid untuk utas saat ini, dan kesalahan umum memanggil t.sleep (), (di sini t adalah utas yang berbeda dari utas saat ini). Bahkan jika T.Sleep () dieksekusi, utas saat ini akan tidur, bukan utas T. T.SUSPEND () adalah metode yang sudah ketinggalan zaman. Menggunakan suspend () menyebabkan utas memasuki keadaan stagnan. Utas akan selalu memegang monitor objek, dan menangguhkan () kemungkinan menyebabkan masalah kebuntuan.
Object.Wait () Membuat utas saat ini keluar dari keadaan "tidak dapat dilarutkan". Tidak seperti sleep (), tunggu adalah metode objek daripada utas. Saat memanggil objek.Wait (), utas pertama perlu mendapatkan kunci objek objek ini. Utas saat ini harus menjaga objek kunci disinkronkan dan menambahkan utas saat ini ke antrian menunggu. Kemudian utas lain dapat menyinkronkan kunci objek yang sama untuk memanggil objek.notify (), yang akan membangunkan utas yang awalnya menunggu dan kemudian melepaskan kunci. Pada dasarnya tunggu ()/notify () mirip dengan sleep ()/interrupt (), kecuali bahwa yang pertama mengharuskan kunci objek untuk diperoleh.
7. Apa yang terjadi saat menggunakan sinkronisasi pada metode statis?
Saat menyinkronkan metode statis, objek "kelas" kelas akan diperoleh. Oleh karena itu, ketika sebuah utas memasukkan metode statis yang disinkronkan, monitor utas memperoleh kunci objek kelas itu sendiri, dan utas lainnya tidak dapat memasukkan metode sinkronisasi statis apa pun dari kelas ini. Ini tidak seperti metode instan, karena banyak utas dapat mengakses berbagai contoh metode instan sinkron secara bersamaan.
8. Ketika metode sinkronisasi telah dieksekusi, dapatkah utas memanggil metode instance asinkron pada objek?
Ya, metode asinkron selalu dapat dipanggil tanpa masalah. Faktanya, Java tidak melakukan pemeriksaan untuk metode asinkron, dan objek kunci hanya diperiksa dalam metode sinkronisasi atau blok kode sinkron. Jika suatu metode tidak dinyatakan sebagai sinkron, bahkan jika Anda menggunakan data bersama, Java masih akan menyebutnya tanpa memeriksa apakah itu aman, jadi berhati -hatilah dalam kasus ini. Apakah suatu metode dinyatakan sinkron tergantung pada akses bagian kritis. Jika metode ini tidak mengakses bagian kritis (sumber daya bersama atau struktur data), tidak perlu menyatakan sinkron.
Berikut adalah contoh: kelas umum memiliki dua metode yang disinkronkanMethod1 () dan method1 (), dan kelas MyThread menyebut kedua metode ini dalam utas independen.
Public Class Common {public disinkronkan void SynchronizedMethod1 () {System.out.println ("SynchronizedMethod1 Called"); coba {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("SynchronizedMethod1 Done"); } public void method1 () {System.out.println ("Metode 1 dipanggil"); coba {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("Metode 1 Done"); }} kelas publik mythread memperluas utas {private int id = 0; Common Common Common; mythread publik (nama string, int no, objek umum) {super (name); umum = objek; id = tidak; } public void run () {System.out.println ("Running Thread" + this.getName ()); coba {if (id == 0) {common.synchronizedMethod1 (); } else {common.method1 (); }} catch (Exception e) {e.printstacktrace (); }} public static void main (string [] args) {common c = new common (); Mythread t1 = mythread baru ("mythread-1", 0, c); Mythread t2 = mythread baru ("mythread-2", 1, c); t1.start (); t2.start (); }}Inilah output dari program:
Menjalankan ThreadMyThread-1
SynchronizedMethod1 disebut
Menjalankan ThreadMyThread-2
Metode 1 dipanggil
SynchronizedMethod1 dilakukan
Metode 1 selesai
Hasilnya menunjukkan bahwa bahkan jika metode SynchronizedMethOD1 () dieksekusi, Method1 () akan dipanggil.
9. Bisakah dua utas menyebut dua metode instance sinkron yang berbeda pada suatu objek?
Tidak, karena suatu objek telah menyinkronkan metode instan, utas memperoleh kunci objek objek. Oleh karena itu, metode sinkronisasi lain hanya dapat dieksekusi setelah metode ini dirilis setelah kunci objek dilepaskan. Contoh kode berikut sangat jelas: kelas umum memiliki metode yang disinkronkanMethod1 () dan disinkronkanmethod2 (), dan MyThread memanggil kedua metode ini.
Public Class Common {public disinkronkan void SynchronizedMethod1 () {System.out.println ("SynchronizedMethod1 Called"); coba {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("SynchronizedMethod1 Done"); } public yang disinkronkan void SynchronizedMethod2 () {System.out.println ("SynchronizedMethod2 Called"); coba {thread.sleep (1000); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("SynchronizedMethod2 Done"); }} kelas publik mythread memperluas utas {private int id = 0; Common Common Common; mythread publik (nama string, int no, objek umum) {super (name); umum = objek; id = tidak; } public void run () {System.out.println ("Running Thread" + this.getName ()); coba {if (id == 0) {common.synchronizedMethod1 (); } else {common.synchronizedMethod2 (); }} catch (Exception e) {e.printstacktrace (); }} public static void main (string [] args) {common c = new common (); Mythread t1 = mythread baru ("mythread-1", 0, c); Mythread t2 = mythread baru ("mythread-2", 1, c); t1.start (); t2.start (); }}10. Apa itu kebuntuan
Kebuntuan berarti bahwa dua atau lebih utas diblokir tanpa batas, dan utas saling menunggu untuk sumber daya yang diperlukan. Ini dapat terjadi ketika dua utas mencoba memperoleh kunci untuk sumber daya lain, dan setiap utas tanpa batas waktu menunggu pelepasan kunci sumber daya lainnya kecuali jika proses pengguna diakhiri. Sejauh menyangkut Javaapi, kebuntuan utas dapat terjadi dalam situasi berikut.
11. Apa itu benang yang kelaparan sampai mati dan apa itu kunci hidup?
Meskipun kelaparan benang dan kunci kehidupan tidak dianggap sebagai masalah umum seperti kebuntuan, mereka seperti pertemuan bagi desainer pemrograman bersamaan.
Ketika semua utas diblokir, atau tidak dapat diproses karena sumber daya yang diperlukan tidak valid, tidak ada utas yang tidak memblokir untuk membuat sumber daya tersedia. Kunci langsung utas di javaapi dapat terjadi dalam situasi berikut:
Pertanyaan -pertanyaan di sini tidak terperinci, saya harap mereka akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!