JavaRush /Java Blog /Random-ID /Terjemahan: 50 pertanyaan wawancara teratas berdasarkan t...
KapChook
Level 19
Volga

Terjemahan: 50 pertanyaan wawancara teratas berdasarkan topik. Bagian 2.

Dipublikasikan di grup Random-ID
Bagian kedua dari terjemahan artikel asli 50 Jawaban Pertanyaan Wawancara Thread Java Teratas untuk Pemrogram Baru dan Berpengalaman. Bagian pertama.
  1. Bagaimana cara memeriksa apakah suatu utas menahan kunci?

  2. Saya tidak tahu bahwa Anda dapat memeriksa apakah suatu thread sedang terkunci sampai saya menemukan pertanyaan ini dalam sebuah wawancara telepon. java.lang.Thread memiliki metode holdLock(), ia mengembalikan nilai true jika dan hanya jika thread saat ini menahan monitor pada objek tertentu.
  3. Bagaimana cara mendapatkan dump thread?

  4. Thread dump memungkinkan Anda mengetahui apa yang sedang dilakukan thread. Ada beberapa cara untuk mendapatkan dump thread, bergantung pada sistem operasinya. Di Windows Anda bisa menggunakan kombinasi ctrl + Break, di Linux Anda bisa menggunakan perintah kill -3. Anda juga dapat menggunakan utilitas jstack; ini beroperasi pada id proses, yang dapat Anda temukan menggunakan utilitas jps lain.
  5. Parameter JVM apa yang digunakan untuk mengontrol ukuran tumpukan thread?

  6. Ini adalah salah satu parameter -Xss sederhana yang digunakan untuk mengontrol ukuran tumpukan thread di Java.
  7. Perbedaan antara tersinkronisasi dan ReentrantLock?

  8. Ada kalanya satu-satunya cara untuk mencapai saling pengecualian adalah melalui kata kunci tersinkronisasi, namun memiliki beberapa kelemahan, seperti tidak dapat memperluas kunci melampaui metode atau blok kode, dll. Java 5 memecahkan masalah ini dengan memberikan kontrol yang lebih terperinci melalui antarmuka Lock. ReentrantLock adalah implementasi Kunci umum yang menyediakan Kunci dengan perilaku dasar dan semantik yang sama seperti monitor implisit, dicapai menggunakan metode tersinkronisasi, namun dengan kemampuan yang ditingkatkan.
  9. Dikasih 3 thread T1, T2 dan T3? Bagaimana cara mengimplementasikan barisan T1, T2, T3?

  10. Konsistensi dapat dicapai dengan banyak cara, namun Anda cukup menggunakan metode join() untuk memulai thread ketika thread lain telah selesai dieksekusi. Untuk mengimplementasikan urutan yang diberikan, Anda harus memulai thread terakhir terlebih dahulu, lalu memanggil metode join() dalam urutan terbalik, yaitu T3 memanggil T2.join dan T2 memanggil T1.join, sehingga T1 akan selesai terlebih dahulu dan T3 terakhir .
  11. Apa fungsi metode hasil?

  12. Metode hasil adalah salah satu cara untuk meminta thread melepaskan CPU agar thread lain dapat dieksekusi. Ini adalah metode statis dan hanya memastikan bahwa thread saat ini akan menyerahkan prosesor, tetapi tidak memutuskan eksekusi thread mana yang akan dilakukan.
  13. Berapa tingkat konkurensi ConcurrentHashMap?

  14. ConcurrentHashMap mencapai skalabilitas dan keamanan thread dengan membagi peta sebenarnya menjadi beberapa bagian. Pemisahan ini dicapai dengan menggunakan tingkat paralelisme. Ini adalah parameter opsional untuk konstruktor ConcurrentHashMap dan nilai defaultnya adalah 16.
  15. Apa itu Semafor?

  16. Semaphore adalah jenis sinkronisasi baru. Ini adalah semafor dengan penghitung. Secara konseptual, semaphore mengontrol sekumpulan izin. Setiap blok acquire(), jika perlu, sebelum izin tersedia, kemudian memperolehnya. Setiap rilis() menambahkan izin, yang berpotensi melepaskan pengakuisisi pemblokiran. Namun, ini tidak menggunakan objek izin sebenarnya; Semaphore hanya menyimpan jumlah yang tersedia dan bertindak sesuai dengan itu. Semaphore digunakan untuk melindungi sumber daya mahal yang tersedia dalam jumlah terbatas, seperti koneksi ke database gabungan.
  17. Apa yang terjadi jika antrean kumpulan thread sudah penuh dan Anda mengirimkan tugas?

  18. Jika antrian kumpulan thread penuh, tugas yang dikirimkan akan "ditolak". Metode submit() ThreadPoolExecutor memunculkan RejectedExecutionException, setelah itu RejectedExecutionHandler dipanggil.
  19. Perbedaan antara metode kirim() dan eksekusi() pada kumpulan utas?

  20. Kedua metode tersebut merupakan cara mengirimkan tugas ke kumpulan thread, namun ada sedikit perbedaan di antara keduanya. Jalankan(Perintah yang dapat dijalankan) didefinisikan di antarmuka Pelaksana dan menjalankan tugas yang diberikan di masa mendatang, tetapi yang lebih penting, tidak mengembalikan apa pun. Di sisi lain, submit() adalah metode yang kelebihan beban, ia dapat menerima tugas Runnable dan Callable dan dapat mengembalikan objek Future yang dapat digunakan untuk membatalkan eksekusi dan/atau menunggu hasil penghitungan. Metode ini didefinisikan dalam antarmuka ExecutorService, yang mewarisi dari antarmuka Executor, dan setiap kelas kumpulan thread, seperti ThreadPoolExecutor atau ScheduledThreadPoolExecutor, mewarisi metode ini.
  21. Apa itu metode pemblokiran?

  22. Metode pemblokiran adalah metode yang memblokir hingga tugas selesai, misalnya metode ServerSocket terima() memblokir saat menunggu klien terhubung. Di sini, pemblokiran berarti kontrol tidak akan kembali ke metode pemanggilan hingga pekerjaan selesai. Di sisi lain, ada metode asynchronous atau non-blocking yang diselesaikan sebelum tugas selesai.
  23. Apakah benang ayun aman?

  24. Sederhananya, tidak, Swing tidak aman untuk thread, tetapi Anda perlu menjelaskan apa yang Anda maksud dengan hal itu, meskipun pewawancara tidak bertanya. Ketika kami mengatakan bahwa Swing tidak aman untuk thread, kami biasanya mengacu pada fakta bahwa Swing adalah komponen yang tidak dapat dimodifikasi oleh banyak thread. Semua perubahan pada komponen GUI harus dilakukan di thread AWT, dan Swing menyediakan metode sinkron dan asinkron untuk menjadwalkan perubahan tersebut.
  25. Perbedaan antara invokeAndWait dan invokeLater?

  26. Ini adalah dua metode Swing API yang memungkinkan pengembang memperbarui komponen GUI dari thread, bukan dari thread Event Manager. InvokeAndWait() secara serempak memperbarui komponen GUI seperti bilah kemajuan; setiap kali ada kemajuan, bilah tersebut harus diperbarui untuk mencerminkan perubahan. Jika kemajuan sedang dilacak di thread lain, ia harus memanggil invokeAndWait() untuk menetapkan thread Event Dispatcher untuk memperbarui komponen tersebut. Dan invokeLater() adalah panggilan asinkron untuk memperbarui komponen.
  27. Metode Swing API manakah yang aman untuk thread?

  28. Pertanyaan ini sekali lagi tentang keamanan Swing dan thread, meskipun komponen Swing tidak aman untuk thread, ada metode yang dapat dipanggil dengan aman dari beberapa thread. Saya tahu bahwa repaint() dan revalidate() aman untuk thread, tetapi ada metode lain pada komponen Swing yang berbeda, seperti metode setText() JTextComponent dan metode insert() dan append() JTextArea.
  29. Bagaimana cara membuat objek yang tidak dapat diubah?

  30. Pertanyaan ini sepertinya tidak ada hubungannya dengan multithreading dan konkurensi, tapi memang ada hubungannya. Kekekalan membantu menyederhanakan kode paralel yang sudah rumit. Objek yang tidak dapat diubah sangat mahal bagi pengembang karena dapat disebarkan tanpa sinkronisasi apa pun. Sayangnya, Java tidak memiliki anotasi @Immutable yang akan membuat objek Anda tidak dapat diubah, sehingga pengembang harus bekerja keras. Untuk membuat objek yang tidak dapat diubah, Anda harus mengikuti dasar-dasarnya: inisialisasi dalam konstruktor, tidak ada penyetel, tidak ada kebocoran referensi, menyimpan salinan terpisah dari objek yang dapat diubah.
  31. Apa itu ReadWriteLock?

  32. Secara umum, ReadWriteLock merupakan hasil teknik penguraian kunci untuk meningkatkan kinerja aplikasi paralel. Ini adalah antarmuka yang ditambahkan di Java 5. Ini beroperasi pada sepasang kunci terkait, satu untuk operasi baca, satu untuk operasi tulis. Kunci pembaca dapat ditahan secara bersamaan oleh beberapa rangkaian bacaan hingga tidak ada lagi penulis. Kunci tulisan bersifat eksklusif. Jika mau, Anda bisa mengimplementasikan antarmuka dengan kumpulan aturan Anda, atau Anda bisa menggunakan ReentrantReadWriteLock, yang mendukung maksimal 65535 kunci tulis rekursif dan 65535 kunci baca.
  33. Apa itu putaran sibuk?

  34. Busy Spin adalah teknik yang digunakan pemrogram untuk memaksa thread menunggu dalam kondisi tertentu. Berbeda dengan metode tradisional, wait(), sleep(), atau yield(), yang melibatkan penyerahan kendali prosesor, metode ini tidak menyerahkan prosesor; melainkan hanya mengeksekusi loop kosong. Mengapa ada orang yang melakukan hal ini? Untuk menyimpan cache prosesor. Pada sistem multi-inti, ada kemungkinan bahwa thread yang ditangguhkan akan terus dijalankan pada inti lain, yang berarti pembuatan ulang cache. Untuk menghindari pembangunan kembali yang mahal, pemrogram memilih untuk menunggu lebih sedikit dengan menggunakan putaran sibuk.
  35. Perbedaan antara variabel volatil dan atom?

  36. Ini pertanyaan yang cukup menarik, pada awalnya variabel volatil dan atom terlihat sangat mirip, namun tetap saja berbeda. Variabel Volatile memberikan jaminan terjadinya-sebelum bahwa penulisan akan terjadi sebelum penulisan berikutnya; variabel ini tidak menjamin atomisitas. Misalnya, operasi count++ tidak akan menjadi atomik hanya karena count dinyatakan volatil. Di sisi lain, kelas AtomicInteger menyediakan metode atom untuk melakukan operasi kompleks seperti itu secara atom, misalnya getAndIncrement() adalah pengganti atom untuk operator kenaikan, ini dapat digunakan untuk menambah nilai saat ini secara atomik sebanyak satu. Ada juga versi atom untuk tipe data lainnya.
  37. Apa yang terjadi jika thread memunculkan Pengecualian di blok yang disinkronkan?

  38. Ini adalah pertanyaan jebakan lainnya untuk pemrogram Java biasa. Tidak peduli bagaimana Anda keluar dari blok yang disinkronkan, baik secara normal dengan menyelesaikan eksekusi atau tiba-tiba dengan melemparkan pengecualian, thread melepaskan kunci yang diperoleh ketika memasuki blok yang disinkronkan. Inilah salah satu alasan mengapa saya lebih memilih blok kunci yang disinkronkan daripada antarmuka yang memerlukan perhatian khusus saat melepaskan kunci, biasanya dicapai dengan melepaskan kunci di blok akhirnya.
  39. Apa yang dimaksud dengan penguncian ganda Singleton?

  40. Ini adalah salah satu pertanyaan wawancara paling populer, namun, meskipun populer, peluang kandidat untuk menjawabnya paling baik adalah 50%. Separuh dari mereka gagal dalam menulis kode, dan separuh lainnya dalam menjelaskan bagaimana kode tersebut rusak dan diperbaiki di Java 1.5. Ini adalah cara lama untuk membuat singleton thread-safe yang mencoba mengoptimalkan kinerja dengan hanya memblokir ketika instance singleton pertama kali dipakai, tetapi karena kerumitannya dan fakta bahwa itu rusak di JDK 1.4, saya pribadi tidak suka dia. Namun, meskipun Anda tidak menyukai pendekatan ini, ada gunanya mengetahuinya dari sudut pandang wawancara.
  41. Bagaimana cara membuat Singleton yang aman untuk thread?

  42. Pertanyaan ini melengkapi pertanyaan sebelumnya. Jika Anda mengatakan Anda tidak menyukai penguncian ganda, maka pewawancara akan terpaksa bertanya tentang cara alternatif untuk membuat Singleton yang aman untuk thread. Dan memang demikian, Anda dapat memanfaatkan fitur pemuatan kelas dan inisialisasi variabel statis untuk membuat instance Singleton, atau Anda dapat memanfaatkan tipe enum yang kuat.
  43. Sebutkan 3 kebiasaan yang Anda ikuti dalam pemrograman paralel?

  44. Ini adalah pertanyaan favorit saya karena saya yakin ada aturan tertentu yang perlu diikuti saat menulis kode paralel, yang membantu kinerja, debugging, dan dukungan. Di bawah ini adalah 3 aturan terbaik yang menurut saya harus diikuti oleh setiap programmer Java:
    • Selalu berikan nama yang bermakna pada thread Anda
    • Menemukan bug atau melacak pengecualian dalam kode paralel adalah tugas yang agak sulit. OrderProcessor, QuoteProcessor atau TradeProcessor jauh lebih baik daripada Thread-1. Benang-2 dan Benang-3. Nama harus mencerminkan tugas yang dilakukan oleh thread. Semua kerangka kerja utama dan bahkan JDK mengikuti aturan ini.
    • Hindari memblokir atau mengurangi cakupan sinkronisasi
    • Pemblokiran itu mahal, dan peralihan konteks bahkan lebih mahal lagi. Cobalah untuk menghindari sinkronisasi dan pemblokiran sebanyak mungkin, dan Anda akan mengurangi bagian kritis ke jumlah minimum yang diperlukan. Inilah mengapa saya lebih memilih blok berjangka waktu daripada metode berjangka waktu karena ini memberi Anda kendali mutlak atas tingkat pemblokiran.
    • Antara sinkronisasi dan tunggu dan beri tahu, pilih sinkronisasi
    • Pertama, sinkronisasi seperti CountDownLatch, Semaphore, CyclicBarrier atau Exchanger menyederhanakan pengkodean. Sangat sulit untuk menerapkan aliran kontrol yang kompleks menggunakan tunggu dan beri tahu. Kedua, kelas-kelas ini ditulis dan dikelola oleh yang terbaik dalam bisnis ini dan ada kemungkinan besar kelas-kelas ini akan dioptimalkan atau diganti dengan kode yang lebih baik di rilis JDK mendatang. Dengan menggunakan utilitas sinkronisasi tingkat tinggi, Anda secara otomatis mendapatkan semua manfaat ini.
    • Antara Koleksi Bersamaan dan Koleksi Tersinkronisasi, pilih Koleksi Bersamaan
    • Ini adalah aturan sederhana lainnya yang mudah diikuti dan mendapatkan manfaatnya. Koleksi serentak lebih terukur daripada koleksi tersinkronisasi, jadi lebih baik menggunakannya saat menulis kode paralel. Jadi lain kali Anda membutuhkan peta, pikirkan tentang ConcurrentHashMap sebelum Anda memikirkan tentang Hashtable.
  45. Bagaimana cara memaksa thread untuk memulai?

  46. Ini adalah pertanyaan ala bagaimana memaksa pengumpulan sampah berjalan. Singkatnya, tidak mungkin, Anda tentu saja dapat membuat kueri menggunakan System.gc(), tetapi itu tidak menjamin apa pun. Sama sekali tidak ada cara untuk memaksa thread dimulai di Java, ini dikontrol oleh penjadwal thread dan Java tidak menyediakan API apa pun untuk mengontrolnya. Bagian Jawa ini masih acak.
  47. Apa itu kerangka Fork/Join?

  48. Kerangka kerja Fork/Join yang diperkenalkan di JDK 7 adalah utilitas canggih yang memungkinkan pengembang memanfaatkan banyak prosesor server modern. Ini dirancang untuk pekerjaan yang dapat dipecah secara rekursif menjadi partikel-partikel kecil. Tujuannya adalah menggunakan semua daya komputasi yang tersedia untuk meningkatkan kinerja aplikasi Anda. Salah satu keuntungan signifikan dari kerangka kerja ini adalah ia menggunakan algoritma pencurian pekerjaan (dari pekerjaan - pekerjaan dan mencuri - untuk mencuri). Thread pekerja yang sudah kehabisan pekerjaan dapat mencuri pekerjaan dari thread lain yang masih sibuk.
  49. Apa perbedaan antara panggilan ke wait() dan sleep()?

  50. Meskipun wait dan sleep mewakili semacam jeda dalam aplikasi Java, keduanya merupakan perangkat untuk kebutuhan yang berbeda. Tunggu digunakan untuk komunikasi thread internal, ia akan mengunci jika kondisi tunggu benar, dan menunggu pemberitahuan jika tindakan thread lain membuat kondisi tunggu salah. Di sisi lain, metode sleep() hanya menghentikan prosesor atau menghentikan eksekusi thread saat ini selama jangka waktu tertentu. Memanggil sleep() tidak melepaskan kunci yang dipegang oleh thread saat ini.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION