JavaRush /Blog Java /Random-MS /Terjemahan: 50 soalan temuduga teratas mengikut urutan. B...
KapChook
Tahap
Volga

Terjemahan: 50 soalan temuduga teratas mengikut urutan. Bahagian 2.

Diterbitkan dalam kumpulan
Bahagian kedua terjemahan artikel asal Top 50 Java Thread Soalan Temuduga Jawapan untuk Freshers, Pengaturcara Berpengalaman. Bahagian pertama.
  1. Bagaimana untuk menyemak sama ada benang memegang kunci?

  2. Saya tidak tahu bahawa anda boleh menyemak sama ada benang sedang memegang kunci sehingga saya menemui soalan ini dalam temu bual telefon. java.lang.Thread mempunyai kaedah holdsLock(), ia mengembalikan benar jika dan hanya jika utas semasa memegang monitor pada objek tertentu.
  3. Bagaimana untuk mendapatkan pembuangan benang?

  4. Longgokan benang membolehkan anda mengetahui perkara yang sedang dilakukan oleh benang. Terdapat beberapa cara untuk mendapatkan pembuangan benang, bergantung pada sistem pengendalian. Pada Windows anda boleh menggunakan gabungan ctrl + Break, di Linux anda boleh menggunakan perintah kill -3. Anda juga boleh menggunakan utiliti jstack; ia beroperasi pada id proses, yang boleh anda ketahui menggunakan utiliti jps yang lain.
  5. Apakah parameter JVM yang digunakan untuk mengawal saiz tindanan benang?

  6. Ini adalah salah satu parameter mudah, -Xss yang digunakan untuk mengawal saiz susunan benang dalam Java.
  7. Perbezaan antara disegerakkan dan ReentrantLock?

  8. Ada kalanya satu-satunya cara untuk mencapai pengecualian bersama adalah melalui kata kunci yang disegerakkan, tetapi kata kunci tersebut mempunyai beberapa kelemahan, seperti tidak dapat melanjutkan kunci melebihi kaedah atau blok kod, dsb. Java 5 menyelesaikan masalah ini dengan menyediakan kawalan yang lebih terperinci melalui antara muka Lock. ReentrantLock ialah pelaksanaan Lock biasa yang menyediakan Lock dengan gelagat asas dan semantik yang sama seperti monitor tersirat, dicapai menggunakan kaedah yang disegerakkan, tetapi dengan keupayaan yang dipertingkatkan.
  9. Diberi 3 utas T1, T2 dan T3? Bagaimana untuk melaksanakan urutan T1, T2, T3?

  10. Konsistensi boleh dicapai dalam banyak cara, tetapi anda hanya boleh menggunakan kaedah join() untuk memulakan utas apabila yang lain telah selesai melaksanakan. Untuk melaksanakan urutan yang diberikan, anda perlu memulakan utas terakhir dahulu, dan kemudian panggil kaedah join() dalam susunan terbalik, iaitu, T3 memanggil T2.join dan T2 memanggil T1.join, jadi T1 akan selesai dahulu dan T3 terakhir .
  11. Apakah yang dilakukan oleh kaedah hasil?

  12. Kaedah hasil ialah satu cara untuk meminta benang menyerahkan CPU supaya benang lain boleh dilaksanakan. Ini adalah kaedah statik dan ia hanya memastikan bahawa utas semasa akan menyerahkan pemproses, tetapi tidak memutuskan pelaksanaan utas yang akan pergi ke.
  13. Apakah tahap konkurensi bagi ConcurrentHashMap?

  14. ConcurrentHashMap mencapai kebolehskalaan dan keselamatan benangnya dengan membahagikan peta sebenar kepada bahagian. Pemisahan ini dicapai dengan menggunakan tahap paralelisme. Ini ialah parameter pilihan kepada pembina ConcurrentHashMap dan nilai lalainya ialah 16.
  15. Apa itu Semaphore?

  16. Semaphore ialah jenis penyegerak baharu. Ini adalah semafor dengan kaunter. Secara konsep, semafor mengawal satu set kebenaran. Setiap acquire() menyekat, jika perlu, sebelum kebenaran tersedia, kemudian memperolehnya. Setiap keluaran() menambah kebenaran, berpotensi melepaskan pemeroleh penyekat. Walau bagaimanapun, ini tidak menggunakan objek kebenaran sebenar; Semaphore hanya menyimpan bilangan yang tersedia dan bertindak sewajarnya. Semaphore digunakan untuk melindungi sumber mahal yang tersedia dalam kuantiti terhad, seperti sambungan ke pangkalan data terkumpul.
  17. Apakah yang berlaku jika baris gilir kumpulan benang sudah penuh dan anda menyerahkan tugasan?

  18. Jika baris gilir kumpulan benang penuh, tugasan yang diserahkan akan "ditolak". Kaedah submit() ThreadPoolExecutor membuang RejectedExecutionException, selepas itu RejectedExecutionHandler dipanggil.
  19. Perbezaan antara kaedah submit() dan execute() pada kumpulan benang?

  20. Kedua-dua kaedah adalah cara untuk menyerahkan tugasan ke kumpulan benang, tetapi terdapat sedikit perbezaan di antara mereka. Laksanakan (Arahan boleh dijalankan) ditakrifkan dalam antara muka Pelaksana dan melaksanakan tugas yang diberikan pada masa hadapan, tetapi yang lebih penting, tidak mengembalikan apa-apa. Sebaliknya, submit() ialah kaedah terlebih beban, ia boleh menerima tugasan Runnable dan Callable dan boleh mengembalikan objek Future yang boleh digunakan untuk membatalkan pelaksanaan dan/atau menunggu hasil pengiraan. Kaedah ini ditakrifkan dalam antara muka ExecutorService, yang mewarisi daripada antara muka Executor, dan setiap kelas kumpulan benang, seperti ThreadPoolExecutor atau ScheduledThreadPoolExecutor, mewarisi kaedah ini.
  21. Apakah kaedah menyekat?

  22. Kaedah menyekat ialah kaedah yang menyekat sehingga tugasan selesai, contohnya, kaedah ServerSocket accept() menyekat sementara menunggu klien menyambung. Di sini, menyekat bermakna kawalan tidak akan kembali kepada kaedah panggilan sehingga kerja selesai. Sebaliknya, terdapat kaedah tak segerak atau tidak menyekat yang selesai sebelum tugas selesai.
  23. Adakah benang Swing selamat?

  24. Ringkasnya, tidak, Swing tidak selamat untuk benang, tetapi anda perlu menjelaskan apa yang anda maksudkan dengan itu, walaupun penemuduga tidak bertanya. Apabila kami mengatakan bahawa Swing tidak selamat untuk benang, kami biasanya merujuk kepada fakta bahawa ia adalah komponen yang tidak boleh diubah suai oleh berbilang benang. Semua perubahan kepada komponen GUI mesti dibuat dalam utas AWT, dan Swing menyediakan kaedah segerak dan tak segerak untuk menjadualkan perubahan tersebut.
  25. Perbezaan antara invokeAndWait dan invokeLater?

  26. Ini ialah dua kaedah Swing API yang membenarkan pembangun mengemas kini komponen GUI daripada utas dan bukannya daripada utas Pengurus Acara. InvokeAndWait() mengemas kini komponen GUI secara serentak seperti bar kemajuan; setiap kali kemajuan dibuat, bar mesti dikemas kini untuk mencerminkan perubahan. Jika kemajuan sedang dijejaki dalam urutan lain, ia mesti memanggil invokeAndWait() untuk menetapkan urutan Penghantar Acara untuk mengemas kini komponen tersebut. Dan invokeLater() ialah panggilan tak segerak untuk mengemas kini komponen.
  27. Kaedah Swing API yang manakah selamat untuk benang?

  28. Soalan ini sekali lagi mengenai keselamatan Swing dan benang, walaupun komponen Swing tidak selamat untuk benang, terdapat kaedah yang boleh dipanggil dengan selamat dari berbilang benang. Saya tahu bahawa repaint() dan revalidate() adalah thread-safe, tetapi terdapat kaedah lain pada komponen Swing yang berbeza, seperti JTextComponent's setText() dan kaedah insert() dan append() JTextArea.
  29. Bagaimana untuk mencipta objek tidak berubah?

  30. Soalan ini mungkin kelihatan tidak ada kaitan dengan multithreading dan concurrency, tetapi ia ada. Ketidakbolehubahan membantu memudahkan kod selari yang sudah kompleks. Objek tidak berubah adalah sangat mahal untuk pembangun kerana ia boleh disebarkan tanpa sebarang penyegerakan. Malangnya, Java tidak mempunyai anotasi @Immutable, yang akan menjadikan objek anda tidak berubah, kerana pembangun ini perlu bekerja keras. Untuk mencipta objek tidak berubah, anda perlu mengikuti asas: permulaan dalam pembina, tiada setter, tiada kebocoran rujukan, menyimpan salinan berasingan objek boleh ubah.
  31. Apakah ReadWriteLock?

  32. Secara umum, ReadWriteLock adalah hasil daripada teknik penghuraian kunci untuk meningkatkan prestasi aplikasi selari. Ini ialah antara muka yang telah ditambah dalam Java 5. Ia beroperasi pada sepasang kunci yang berkaitan, satu untuk operasi baca, satu untuk operasi tulis. Kunci pembaca boleh dipegang serentak oleh beberapa utas bacaan sehingga tiada penulis. Kunci penulisan adalah eksklusif. Jika anda mahu, anda boleh melaksanakan antara muka dengan set peraturan anda atau anda boleh menggunakan ReentrantReadWriteLock, yang menyokong maksimum 65535 kunci tulis rekursif dan 65535 kunci baca.
  33. Apa yang sibuk berputar?

  34. Busy Spin ialah teknik yang digunakan pengaturcara untuk memaksa benang menunggu dalam keadaan tertentu. Tidak seperti kaedah tradisional, wait(), sleep() atau yield(), yang melibatkan kawalan penyerahan pemproses, kaedah ini tidak menyerahkan pemproses; sebaliknya, ia hanya melaksanakan gelung kosong. Mengapa sesiapa akan melakukan ini? Untuk menyimpan cache pemproses. Pada sistem berbilang teras, ada kemungkinan benang yang digantung akan terus dilaksanakan pada teras lain, yang bermaksud binaan semula cache. Untuk mengelakkan pembinaan semula yang mahal, pengaturcara lebih suka menunggu kurang dengan menggunakan putaran yang sibuk.
  35. Perbezaan antara pembolehubah yang tidak menentu dan atom?

  36. Ini adalah soalan yang agak menarik, pada mulanya pembolehubah tidak menentu dan atom kelihatan sangat serupa, tetapi ia masih berbeza. Pembolehubah tidak menentu menyediakan jaminan berlaku sebelum bahawa penulisan akan berlaku sebelum sebarang penulisan berikutnya; ia tidak menjamin keatomisan. Sebagai contoh, operasi count++ tidak akan menjadi atom hanya kerana kiraan diisytiharkan tidak menentu. Sebaliknya, kelas AtomicInteger menyediakan kaedah atom untuk melaksanakan operasi kompleks sedemikian secara atom, contohnya getAndIncrement() ialah penggantian atom untuk pengendali kenaikan, ia boleh digunakan untuk menambah nilai semasa secara atom sebanyak satu. Terdapat juga versi atom untuk jenis data lain.
  37. Apakah yang berlaku jika benang melemparkan Pengecualian dalam blok yang disegerakkan?

  38. Ini adalah satu lagi soalan muslihat untuk pengaturcara Java biasa. Tidak kira bagaimana anda keluar dari blok yang disegerakkan, sama ada biasanya dengan menamatkan pelaksanaan atau secara tiba-tiba dengan melemparkan pengecualian, benang melepaskan kunci yang diperoleh apabila ia memasuki blok yang disegerakkan. Ini adalah salah satu sebab mengapa saya lebih suka blok kunci yang disegerakkan daripada antara muka yang memerlukan penjagaan khas apabila melepaskan kunci, biasanya dicapai dengan melepaskan kunci dalam blok akhirnya.
  39. Apakah penguncian semakan dua kali Singleton?

  40. Ini adalah salah satu soalan temuduga yang paling popular, namun, walaupun popular, peluang calon menjawabnya adalah 50% yang terbaik. Separuh masa mereka gagal menulis kod, dan separuh lagi menjelaskan bagaimana ia dipecahkan dan diperbaiki dalam Java 1.5. Ini adalah cara lama untuk mencipta singleton selamat-benang yang cuba mengoptimumkan prestasi dengan hanya menyekat apabila contoh singleton mula-mula digunakan, tetapi disebabkan kerumitan dan fakta bahawa ia telah dipecahkan dalam JDK 1.4, saya secara peribadi tidak suka ia. Namun, walaupun anda tidak menyukai pendekatan ini, adalah berguna untuk mengetahuinya dari perspektif temu bual.
  41. Bagaimana untuk mencipta Singleton selamat benang?

  42. Soalan ini melengkapkan soalan sebelumnya. Jika anda mengatakan anda tidak suka penguncian yang disemak dua kali, maka penemuduga akan terpaksa bertanya tentang cara alternatif untuk mencipta Singleton yang selamat untuk benang. Dan mereka adalah, anda boleh memanfaatkan pemuatan kelas dan ciri permulaan pembolehubah statik untuk membuat instantiate Singleton, atau anda boleh memanfaatkan jenis enum yang berkuasa.
  43. Senaraikan 3 adat yang anda ikuti dalam pengaturcaraan selari?

  44. Ini soalan kegemaran saya kerana saya percaya terdapat peraturan tertentu yang perlu dipatuhi semasa menulis kod selari, yang membantu dengan prestasi, penyahpepijatan dan sokongan. Di bawah ialah 3 peraturan terbaik yang saya percaya setiap pengaturcara Java harus mengikuti:
    • Sentiasa berikan nama yang bermakna pada rangkaian anda
    • Mencari pepijat atau menjejaki pengecualian dalam kod selari adalah tugas yang agak sukar. OrderProcessor, QuoteProcessor atau TradeProcessor jauh lebih baik daripada Thread-1. Benang-2 dan Benang-3. Nama harus mencerminkan tugas yang dilakukan oleh urutan. Semua rangka kerja utama dan juga JDK mengikut peraturan ini.
    • Elakkan menyekat atau mengurangkan skop penyegerakan
    • Penyekatan adalah mahal, dan penukaran konteks adalah lebih mahal. Cuba elakkan penyegerakan dan sekatan sebanyak mungkin, dan anda akan mengurangkan bahagian kritikal ke tahap minimum yang diperlukan. Inilah sebabnya saya lebih suka blok bermasa berbanding kaedah bermasa kerana ia memberi anda kawalan mutlak ke atas tahap penyekatan.
    • Antara penyegerak dan tunggu dan maklumkan, pilih penyegerak
    • Pertama, penyegerak seperti CountDownLatch, Semaphore, CyclicBarrier atau Exchanger memudahkan pengekodan. Sangat sukar untuk melaksanakan aliran kawalan kompleks menggunakan tunggu dan maklumkan. Kedua, kelas ini ditulis dan diselenggara oleh yang terbaik dalam perniagaan dan terdapat peluang yang baik bahawa mereka akan dioptimumkan atau digantikan dengan kod yang lebih baik dalam keluaran JDK akan datang. Dengan menggunakan utiliti penyegerakan peringkat tinggi, anda secara automatik mendapat semua faedah ini.
    • Antara Koleksi Serentak dan Koleksi Tersegerak, pilih Koleksi Serentak
    • Ini adalah satu lagi peraturan mudah yang mudah diikuti dan mendapat faedah. Koleksi serentak lebih berskala daripada rakan sejawatannya, jadi lebih baik menggunakannya semasa menulis kod selari. Jadi lain kali anda memerlukan peta, fikirkan tentang ConcurrentHashMap sebelum anda berfikir tentang Hashtable.
  45. Bagaimana untuk memaksa benang dimulakan?

  46. Ini adalah soalan ala bagaimana memaksa kutipan sampah dijalankan. Pendek kata, tidak mungkin, anda sudah tentu boleh membuat pertanyaan menggunakan System.gc(), tetapi ia tidak menjamin apa-apa. Sama sekali tidak ada cara untuk memaksa thread dimulakan di Java, ini dikawal oleh penjadual thread dan Java tidak menyediakan sebarang API untuk mengawalnya. Bahagian Java ini masih rawak.
  47. Apakah rangka kerja Fork/Join?

  48. Rangka kerja Fork/Join yang diperkenalkan dalam JDK 7 ialah utiliti berkuasa yang membolehkan pembangun memanfaatkan berbilang pemproses pelayan moden. Ia direka untuk kerja yang boleh dipecahkan secara rekursif kepada zarah kecil. Matlamatnya adalah untuk menggunakan semua kuasa pengkomputeran yang ada untuk meningkatkan prestasi aplikasi anda. Satu kelebihan penting rangka kerja ini ialah ia menggunakan algoritma mencuri kerja (dari kerja - kerja dan mencuri - untuk mencuri). Benang pekerja yang telah kehabisan kerja boleh mencuri kerja dari benang lain yang masih sibuk.
  49. Apakah perbezaan antara panggilan menunggu() dan tidur()?

  50. Walaupun kedua-dua tunggu dan tidur mewakili sejenis jeda dalam aplikasi Java, ia adalah peranti untuk keperluan yang berbeza. Tunggu digunakan untuk komunikasi utas dalaman, ia menghasilkan untuk mengunci jika syarat tunggu adalah benar dan menunggu pemberitahuan jika tindakan urutan lain menjadikan syarat tunggu palsu. Sebaliknya, kaedah sleep() hanya menyerahkan pemproses atau menghentikan utas semasa daripada melaksanakan untuk tempoh masa tertentu. Memanggil sleep() tidak melepaskan kunci yang dipegang oleh benang semasa.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION