Di bawah ini adalah pertanyaan wawancara populer yang terkait dengan utas Java, Anda dapat menggunakannya untuk mempersiapkan wawancara.
1) Apa itu utas?
Utas adalah unit terkecil yang dapat dilakukan oleh sistem operasi dan penjadwalan. Ini terkandung dalam proses dan merupakan unit operasi yang sebenarnya dalam proses. Pemrogram dapat memprogram multiprosesor melalui itu, dan Anda dapat mempercepat tugas-tugas intensif operasi menggunakan multithreading. Misalnya, jika dibutuhkan 100 milidetik untuk utas untuk menyelesaikan tugas, hanya dibutuhkan 10 milidetik untuk utas untuk menyelesaikan perubahan tugas menggunakan sepuluh utas. Java memberikan dukungan yang sangat baik untuk multithreading di tingkat bahasa, dan juga merupakan titik penjualan yang baik. Untuk detail lebih lanjut, silakan klik di sini.
2) Apa perbedaan antara utas dan proses?
Utas adalah himpunan bagian dari proses. Suatu proses dapat memiliki banyak utas, dan setiap utas melakukan tugas yang berbeda secara paralel. Proses yang berbeda menggunakan ruang memori yang berbeda, sementara semua utas berbagi ruang memori yang sama. Jangan mengacaukannya dengan memori tumpukan, setiap utas memiliki memori tumpukan terpisah untuk menyimpan data lokal. Untuk detail lebih lanjut, silakan klik di sini.
3) Bagaimana cara mengimplementasikan utas di java?
Ada dua cara di tingkat bahasa. Contoh kelas java.lang.thread adalah utas, tetapi perlu memanggil antarmuka java.lang.runnable untuk dieksekusi. Karena kelas utas itu sendiri adalah antarmuka runnable yang disebut, Anda dapat mewarisi kelas java.lang.thread atau secara langsung memanggil antarmuka runnable untuk mengganti metode run () untuk mengimplementasikan utas. Untuk detail lebih lanjut, silakan klik di sini.
4) Gunakan runnable atau utas?
Pertanyaan ini merupakan tindak lanjut dari pertanyaan sebelumnya. Semua orang tahu bahwa kami dapat menerapkan utas dengan mewarisi kelas utas atau memanggil antarmuka yang dapat dilalui. Pertanyaannya adalah, metode mana yang lebih baik? Dalam keadaan apa saya harus menggunakannya? Pertanyaan ini mudah dijawab jika Anda tahu bahwa Java tidak mendukung banyak warisan kelas, tetapi memungkinkan Anda untuk memanggil beberapa antarmuka. Jadi, jika Anda ingin mewarisi kelas lain, tentu saja, lebih baik memanggil antarmuka yang dapat dijalankan. Untuk detail lebih lanjut, silakan klik di sini.
6) Apa perbedaan antara metode start () dan run () di kelas utas?
Pertanyaan ini sering ditanyakan, tetapi masih dapat membedakan pemahaman pewawancara tentang model threading Java dari ini. Metode start () digunakan untuk memulai utas yang baru dibuat, dan metode run () disebut secara internal, yang berbeda dari efek secara langsung memanggil metode run (). Saat Anda memanggil metode run (), itu hanya akan dipanggil di utas asli. Jika tidak ada utas baru yang dimulai, metode start () akan memulai utas baru. Untuk diskusi lebih lanjut, silakan klik di sini
7) Apa perbedaan antara Runnable dan Callable di Java?
Baik runnable dan callable mewakili tugas yang akan dieksekusi di utas yang berbeda. Runnable telah tersedia sejak JDK1.0, dan Callable telah ditambahkan di JDK1.5. Perbedaan utama mereka adalah bahwa metode panggilan () dari Callable dapat mengembalikan nilai dan melempar pengecualian, sedangkan metode run () Runnable tidak memiliki fungsi -fungsi ini. Callable dapat mengembalikan objek di masa depan yang dimuat dengan hasil perhitungan. Blog saya memiliki instruksi yang lebih rinci.
8) Apa perbedaan antara Cyclicbarrier dan Countdownlatch di Java?
Baik Cyclicbarrier dan Countdownlatch dapat digunakan untuk membuat sekelompok utas menunggu utas lainnya. Tidak seperti Cyclicbarrier, Countdownlatch tidak dapat digunakan kembali. Klik di sini untuk melihat informasi lebih lanjut dan kode contoh.
9) Apa model memori Java?
Model memori Java menentukan dan memandu program Java untuk berperilaku deterministik antara arsitektur memori yang berbeda, CPU, dan sistem operasi. Ini sangat penting dalam situasi multi-threading. Model memori Java dapat memastikan bahwa perubahan yang dibuat oleh satu utas terlihat oleh utas lain, dan hubungan terjadi terlebih dahulu. Hubungan ini mendefinisikan beberapa aturan untuk membuat programmer lebih jelas dalam pemrograman bersamaan mereka. Misalnya, memiliki hubungan terlebih dahulu memastikan:
Kode dalam utas dapat dieksekusi secara berurutan, yang disebut aturan pesanan program.
Untuk kunci yang sama, operasi membuka kunci harus terjadi sebelum operasi kunci lain yang terjadi dalam waktu, yang juga disebut aturan penguncian manajemen.
Operasi penulisan sebelumnya ke volatile adalah sebelum operasi baca berikutnya dari volatile, yang juga disebut aturan variabel volatil.
Operasi apa pun dalam utas harus dipanggil setelah start () dari utas ini, juga dikenal sebagai aturan start utas.
Semua operasi utas akan diakhiri sebelum utas berakhir.
Operasi penghentian suatu objek harus setelah objek dibangun, yang juga disebut Aturan Pengakhiran Objek.
Transitif
Saya sangat menyarankan agar Anda membaca Bab 16 dari "Praktik Pemrograman Konkurensi Java" untuk memperdalam pemahaman Anda tentang model memori Java.
10) Apa variabel volatil di java?
Volatile adalah pengubah khusus yang hanya dapat digunakan oleh variabel anggota. Dalam kasus di mana program bersamaan Java tidak memiliki kelas sinkron, operasi multithreading pada variabel anggota transparan ke utas lain. Variabel volatil dapat memastikan bahwa operasi baca berikutnya akan terjadi setelah operasi penulisan sebelumnya, yang merupakan aturan variabel volatil dari pertanyaan sebelumnya. Klik di sini untuk melihat konten terkait yang lebih mudah menguap.
11) Apa itu keamanan utas? Apakah Vector merupakan kelas yang aman dari utas? (Lihat di sini untuk detailnya)
Jika kode Anda dalam proses di mana Anda berada, ada beberapa utas yang berjalan pada saat yang sama, dan utas ini dapat menjalankan kode ini secara bersamaan. Jika hasil dari setiap proses sama dengan hasil dari satu utas yang dijalankan, dan nilai-nilai variabel lain sama dengan yang diharapkan, itu aman. Objek instance yang sama dari kelas penghitung yang aman-utas tidak akan menyebabkan kesalahan perhitungan bila digunakan oleh beberapa utas. Jelas Anda dapat membagi kelas pengumpulan menjadi dua grup, yang aman dan tidak aman. Vektor menggunakan metode sinkronisasi untuk mencapai keamanan utas, sedangkan arraylist yang mirip dengannya tidak aman.
12) Apa kondisi ras di java? Berikan contoh.
Kondisi ras akan menyebabkan beberapa bug terjadi dalam situasi bersamaan program. Ketika multi-threading bersaing untuk beberapa sumber daya, kondisi ras akan muncul. Jika program pertama yang dieksekusi gagal dan kemudian dieksekusi, beberapa bug yang tidak pasti akan muncul di seluruh program. Bug seperti itu sulit dideteksi dan berulang karena persaingan acak antar utas. Contohnya adalah pemrosesan yang tidak teratur, lihat jawaban untuk detailnya.
13) Bagaimana cara menghentikan utas di java?
Java menyediakan API yang kaya tetapi tidak menyediakan API untuk menghentikan benang. JDK 1.0 awalnya memiliki beberapa metode kontrol seperti stop (), suspend () dan resume (), tetapi karena potensi ancaman kebuntuan, mereka sudah usang dalam versi JDK berikutnya. Setelah itu, perancang Java API tidak memberikan cara yang kompatibel dan aman untuk menghentikan utas. Ketika metode run () atau call () dieksekusi, utas akan secara otomatis berakhir. Jika Anda ingin mengakhiri utas secara manual, Anda dapat menggunakan variabel boolean yang mudah menguap untuk keluar dari loop metode run () atau membatalkan tugas untuk mengganggu utas. Klik di sini untuk melihat kode sampel.
14) Apa yang terjadi ketika pengecualian terjadi ketika utas berjalan?
Ini adalah pertanyaan wawancara Java yang sangat rumit yang saya temui dalam sebuah wawancara. Sederhananya, jika pengecualian tidak tertangkap, utas akan berhenti mengeksekusi.
Thread.uncaughtExceptionHandler adalah antarmuka tertanam untuk menangani pengecualian yang tidak tertulis yang menyebabkan gangguan benang mendadak. Ketika pengecualian yang tidak tertiru menyebabkan utas menyela, JVM akan menggunakan thread.getuncaughtExceptionHandler () untuk menanyakan utas yang tidak tertangani dan meneruskan utas dan pengecualian sebagai parameter ke metode handler uncaughtException () untuk diproses.
15) Bagaimana cara berbagi data antara dua utas?
Anda dapat melakukan ini dengan berbagi objek, atau menggunakan struktur data bersamaan seperti memblokir antrian. Tutorial ini, "Java Inter-Thread Communication" (yang melibatkan berbagi objek antara dua utas) menggunakan metode menunggu dan memberi tahu untuk mengimplementasikan model konsumen produsen.
16) Apa perbedaan antara Notify dan NotifyAll in Java?
Ini adalah masalah rumit lainnya, karena multithreading dapat menunggu kunci pemantauan tunggal, dan perancang API Java menyediakan beberapa cara untuk memberi tahu mereka ketika menunggu kondisi berubah, tetapi metode ini tidak sepenuhnya diimplementasikan. Metode notify () tidak dapat membangunkan utas tertentu, sehingga hanya akan berfungsi ketika satu utas menunggu. Dan NotifyAll () membangunkan semua utas dan memungkinkan mereka untuk bersaing untuk mengunci untuk memastikan bahwa setidaknya satu utas dapat terus berjalan. Blog saya memiliki informasi dan kode sampel yang lebih rinci.
17) Mengapa Wait, Notify dan NotifyAll Metode Tidak di Kelas Thread?
Ini adalah pertanyaan terkait desain yang meneliti persepsi pewawancara tentang sistem yang ada dan sesuatu yang umum tetapi tampaknya tidak masuk akal. Saat menjawab pertanyaan -pertanyaan ini, Anda perlu menjelaskan mengapa masuk akal untuk meletakkan metode ini di kelas objek, dan mengapa tidak menempatkannya di kelas utas. Salah satu alasan yang jelas adalah bahwa kunci yang disediakan oleh Java adalah tingkat objek daripada level utas, dan setiap objek memiliki kunci, diperoleh melalui utas. Jika utas perlu menunggu beberapa kunci, masuk akal untuk memanggil metode tunggu () di objek. Jika metode tunggu () didefinisikan di kelas utas, tidak akan jelas kunci mana yang ditunggu -tunggu. Sederhananya, karena tunggu, beri tahu dan beri tahu semua adalah operasi tingkat kunci, mereka didefinisikan di kelas objek karena kunci milik objek. Anda juga dapat memeriksa artikel ini untuk mempelajari lebih lanjut.
18) Apa itu variabel threadlocal?
Threadlocal adalah variabel khusus di Java. Setiap utas memiliki threadlocal, yang berarti bahwa setiap utas memiliki variabel independennya sendiri, dan kondisi balapan sepenuhnya dihilangkan. Ini adalah cara yang bagus untuk mendapatkan utas yang aman untuk membuat objek yang mahal. Misalnya, Anda dapat menggunakan ThreadLocal untuk membuat thread-safe yang sederhana karena kelas itu mahal untuk dibuat dan membutuhkan pembuatan instance yang berbeda untuk setiap panggilan, sehingga tidak layak menggunakannya secara lokal. Jika Anda memberikan masing -masing utas dengan salinan variabel yang unik, itu akan sangat meningkatkan efisiensi. Pertama, jumlah objek mahal yang dibuat dikurangi dengan multiplexing. Kedua, Anda mendapatkan keamanan utas tanpa menggunakan sinkronisasi atau invarianisasi yang mahal. Contoh lain yang baik dari variabel lokal utas adalah kelas threadlocalrandom, yang mengurangi jumlah objek acak mahal yang dibuat dalam lingkungan multi-threaded. Lihat jawaban untuk mempelajari lebih lanjut.
19) Apa itu Futuretask?
Dalam program bersamaan Java, Futuretask mewakili operasi asinkron yang dapat dibatalkan. Ini memiliki metode seperti memulai dan membatalkan operasi, menanyakan apakah operasi selesai dan mengambil hasil operasi. Hasilnya hanya dapat diambil saat operasi selesai. Jika operasi belum selesai, metode GET akan diblokir. Objek Futuretask dapat membungkus objek yang disebut dapat dipanggil dan dapat dijalankan. Karena Futuretask juga memanggil antarmuka yang dapat dijalankan, itu dapat diserahkan kepada pelaksana untuk dieksekusi.
20) Apa perbedaan antara metode terputus dan terputus di Java?
Perbedaan utama antara interrupted () dan iSintrupted () adalah bahwa yang pertama akan menghapus keadaan interupsi sementara yang terakhir tidak akan. Mekanisme interupsi java multithreading diimplementasikan dengan pengidentifikasi internal. Calling Thread.Interrupt () Untuk mengganggu utas akan mengatur pengidentifikasi interupsi ke True. Ketika utas interupsi memanggil utas metode statis. Terputus () untuk memeriksa keadaan interupsi, keadaan interupsi akan dihapus. Metode non-statis terputus () digunakan untuk menanyakan status interupsi utas lain tanpa mengubah pengidentifikasi status interupsi. Sederhananya, metode apa pun yang melempar interupsi Exception akan menghapus keadaan interupsi. Bagaimanapun, keadaan interupsi utas dapat diubah oleh utas lain yang memanggil interupsi.
21) Mengapa menunggu dan memberi tahu metode perlu dipanggil dalam blok sinkron?
Ini terutama karena Java API memaksa ini, dan jika tidak, kode Anda akan melempar pengecualian IlegalmonitorStateException. Alasan lain adalah untuk menghindari kondisi ras antara menunggu dan memberi tahu.
22) Mengapa Anda harus memeriksa kondisi tunggu di loop?
Thread dalam keadaan menunggu dapat menerima peringatan kesalahan dan semu-bangun. Jika kondisi tunggu tidak diperiksa di loop, program akan keluar tanpa memenuhi kondisi akhir. Oleh karena itu, ketika utas yang menunggu bangun, tidak dapat dipertimbangkan bahwa keadaan menunggu aslinya masih valid, dan dapat berubah selama periode ini setelah panggilan metode notify () dan sebelum utas menunggu bangun. Inilah sebabnya mengapa menggunakan metode tunggu () dalam loop berfungsi lebih baik, Anda dapat membuat templat di Eclipse untuk menelepon tunggu dan memberi tahu dan mencobanya. Jika Anda ingin mempelajari lebih lanjut tentang masalah ini, saya sarankan Anda untuk membaca bab threading dan sinkronisasi dalam buku "Efektif Java".
23) Apa perbedaan antara koleksi sinkron dan koleksi bersamaan di Java?
Koleksi sinkron dan koleksi bersamaan menyediakan koleksi yang sesuai dengan sela-jaga yang sesuai untuk multithreading dan concurrency, tetapi koleksi bersamaan lebih dapat diskalakan. Sebelum Java 1.5, programmer hanya menggunakan koleksi sinkron, dan ketika konkurensi multi-utas berkontribusi, itu akan mengarah pada pertengkaran, menghambat skalabilitas sistem. Java5 memperkenalkan koleksi bersamaan seperti ConcurrenthashMap, yang tidak hanya memberikan keamanan utas tetapi juga meningkatkan skalabilitas dengan teknologi modern seperti pemisahan kunci dan zona internal. Lihat jawabannya untuk lebih jelasnya.
24) Apa perbedaan antara tumpukan dan tumpukan di Java?
Mengapa pertanyaan ini diklasifikasikan dalam pertanyaan wawancara multi-threaded dan bersamaan? Karena tumpukan adalah area memori yang terkait erat dengan utas. Setiap utas memiliki memori tumpukannya sendiri, yang digunakan untuk menyimpan variabel lokal, parameter metode, dan panggilan tumpukan. Variabel yang disimpan dalam satu utas tidak terlihat oleh utas lain. Tumpukan adalah area memori umum yang dibagikan oleh semua utas. Objek dibuat di tumpukan. Untuk meningkatkan efisiensi, utas akan menyimpan A dari tumpukan ke tumpukannya sendiri. Jika beberapa utas menggunakan variabel ini, itu dapat menyebabkan masalah. Pada saat ini, variabel yang mudah menguap dapat memainkan peran, yang mengharuskan utas untuk membaca nilai variabel dari memori utama.
Lihat jawabannya untuk lebih jelasnya.
25) Apa itu kumpulan utas? Mengapa menggunakannya?
Membuat utas membutuhkan sumber daya dan waktu yang mahal. Jika utas dibuat hanya setelah tugas datang, waktu respons akan menjadi lebih lama, dan suatu proses dapat membuat sejumlah utas. Untuk menghindari masalah ini, beberapa utas dibuat untuk merespons dan memproses ketika program dimulai. Mereka disebut kumpulan benang, dan utas di dalamnya disebut utas pekerja. Dimulai dengan JDK1.5, Java API menyediakan kerangka kerja pelaksana yang memungkinkan Anda membuat kumpulan utas yang berbeda. Misalnya, satu kumpulan utas, yang menangani satu tugas pada satu waktu; Sejumlah tetap kumpulan utas atau kumpulan benang cache (kumpulan utas yang dapat diperluas yang cocok untuk banyak program dengan tugas berumur pendek). Lihat artikel ini untuk lebih jelasnya.
26) Bagaimana cara menulis kode untuk menyelesaikan masalah produsen dan konsumen?
Pada kenyataannya, banyak masalah utas yang Anda selesaikan termasuk dalam model konsumen produsen, yaitu satu tugas produksi utas adalah untuk dikonsumsi oleh utas lain. Anda harus tahu cara berkomunikasi di antara utas untuk menyelesaikan masalah ini. Metode yang relatif rendah adalah menggunakan menunggu dan memberi tahu untuk menyelesaikan masalah ini. Metode yang lebih baik adalah menggunakan semaphore atau blockingqueue untuk mengimplementasikan model produsen dan konsumen. Tutorial ini mengimplementasikannya.
27) Bagaimana cara menghindari kebuntuan?
Kebuntuan di java multithreading
Deadlock mengacu pada fenomena penantian bersama yang disebabkan oleh dua atau lebih proses selama proses eksekusi karena persaingan untuk sumber daya. Tanpa kekuatan eksternal, mereka tidak akan dapat melanjutkan. Ini adalah masalah serius, karena kebuntuan akan membuat program Anda ditangguhkan dan tidak dapat menyelesaikan tugas. Empat kondisi berikut harus dipenuhi untuk terjadinya kebuntuan:
Kondisi eksklusi bersama: Sumber daya hanya dapat digunakan oleh satu proses pada satu waktu.
Permintaan dan tahan persyaratan: Ketika suatu proses diblokir karena meminta sumber daya, itu membuat sumber daya yang diperoleh.
Kondisi untuk tidak merampas: Sumber daya yang diperoleh oleh proses tidak dapat secara paksa dirampas sampai akhir penggunaan.
Kondisi tunggu loop: Hubungan sumber daya tunggu loop dibentuk antara beberapa proses yang terhubung di kepala dan ekor.
Cara termudah untuk menghindari kebuntuan adalah dengan mencegah kondisi tunggu loop, menetapkan bendera dan mengurutkan semua sumber daya dalam sistem, dan menetapkan bahwa semua sumber daya proses harus dioperasikan dalam urutan tertentu (pesanan naik atau turun) untuk menghindari kebuntuan. Tutorial ini memiliki contoh kode dan detail diskusi tentang menghindari kebuntuan.
28) Apa perbedaan antara kunci hidup dan kebuntuan di Java?
Ini adalah perpanjangan dari pertanyaan sebelumnya. Kunci hidup mirip dengan kebuntuan. Perbedaannya adalah keadaan utas atau proses dalam kunci langsung terus berubah. Kunci langsung dapat dianggap sebagai jenis kelaparan khusus. Contoh realistis dari kunci langsung adalah ketika dua orang bertemu di koridor sempit. Keduanya berusaha saling menghindari sehingga satu sama lain dapat melewati, tetapi karena arah penghindarannya sama, tidak ada yang bisa melewati koridor pada akhirnya. Sederhananya, perbedaan utama antara kunci hidup dan kunci mati adalah bahwa keadaan proses sebelumnya dapat diubah tetapi tidak dapat terus dieksekusi.
29) Bagaimana cara mendeteksi apakah utas memiliki kunci?
Saya tidak pernah tahu kami benar -benar dapat mendeteksi jika utas memiliki kunci sampai saya menghadiri wawancara telepon. Ada metode di java.lang.thread dipanggil HoldsLock (), yang mengembalikan true jika dan hanya jika utas saat ini memiliki kunci untuk objek tertentu. Anda dapat memeriksa artikel ini untuk mempelajari lebih lanjut.
30) Bagaimana Anda mendapatkan tumpukan utas di java?
Untuk sistem operasi yang berbeda, ada beberapa cara untuk mendapatkan tumpukan utas proses java. Saat Anda mendapatkan tumpukan utas, JVM akan menyimpan status semua utas ke file log atau mengeluarkannya ke konsol. Di Windows, Anda dapat menggunakan kombinasi kunci Ctrl + Break untuk mendapatkan tumpukan utas, dan menggunakan perintah Kill -3 di Linux. Anda juga dapat menggunakan alat JStack untuk mendapatkannya, yang beroperasi pada ID utas, dan Anda dapat menggunakan alat JPS untuk menemukan ID.
31) Parameter mana dalam JVM digunakan untuk mengontrol tumpukan benang dengan tumpukan kecil
Masalah ini sangat sederhana, parameter -XSS digunakan untuk mengontrol ukuran tumpukan utas. Anda dapat melihat daftar konfigurasi JVM untuk informasi lebih lanjut tentang parameter ini.
32) Apa perbedaan antara sinkronisasi dan reentrantlock di java?
Java telah mampu mencapai pengecualian bersama untuk waktu yang lama melalui kata kunci yang disinkronkan, dan memiliki beberapa kelemahan. Misalnya, Anda tidak dapat memperluas metode atau memblokir batas selain kunci, dan Anda tidak dapat membatalkan setengah saat mencoba mendapatkan kunci, dll. Java 5 menyediakan kontrol yang lebih kompleks untuk menyelesaikan masalah ini melalui antarmuka kunci. Kelas Reentrantlock mengimplementasikan Lock, yang memiliki konkurensi dan semantik memori yang sama seperti disinkronkan dan juga dapat diperluas. Anda dapat memeriksa artikel ini untuk mempelajari lebih lanjut
33) Ada tiga utas T1, T2, dan T3. Bagaimana cara memastikan mereka dieksekusi secara berurutan?
Ada banyak cara untuk mengaktifkan utas untuk dieksekusi dalam urutan tertentu dalam multithreading. Anda dapat menggunakan metode join () dari kelas utas untuk memulai utas lain di satu utas, dan utas lain melengkapi utas untuk melanjutkan eksekusi. Untuk memastikan urutan tiga utas, Anda harus memulai yang terakhir (T3 Calls T2, T2 Calls T1), sehingga T1 akan selesai terlebih dahulu dan T3 akan selesai terakhir. Anda dapat memeriksa artikel ini untuk mempelajari lebih lanjut.
34) Apa fungsi metode hasil di kelas utas?
Metode hasil dapat menjeda objek utas yang saat ini dieksekusi dan memungkinkan utas lain dengan prioritas yang sama untuk dieksekusi. Ini adalah metode statis dan hanya memastikan bahwa utas saat ini menyerahkan penggunaan CPU dan tidak dapat menjamin bahwa utas lain dapat menempati CPU. Yield yang dieksekusi utas () dapat dieksekusi segera setelah memasuki negara yang dijeda. Klik di sini untuk melihat lebih lanjut tentang metode hasil.
35) Apa konkurensi concurrenthashmap di java?
ConcurrenthashMap membagi peta aktual menjadi beberapa bagian untuk mencapai skalabilitas dan keamanan utasnya. Divisi ini diperoleh dengan menggunakan konkurensi, yang merupakan parameter opsional untuk konstruktor kelas ConcurrenthashMap, dengan nilai default 16, sehingga pertengkaran dapat dihindari dalam situasi multithreading. Untuk lebih banyak konkurensi dan pengubah ukuran internal, silakan baca artikel saya bagaimana concurrenthashmap bekerja di Java.
36) Apa itu semaphore di java?
Semaphore di Java adalah kelas sinkronisasi baru, yang merupakan sinyal penghitungan. Secara konseptual, konseptual, semaphore mempertahankan serangkaian izin. Jika perlu, masing -masing memperoleh () akan diblokir sebelum lisensi tersedia sebelum diperoleh. Setiap rilis () menambahkan izin, yang dapat melepaskan pengakuisisi pemblokiran. Namun, tanpa menggunakan objek lisensi yang sebenarnya, Semaphore hanya menghitung nomor lisensi yang tersedia dan mengambil tindakan yang sesuai. Semaphores sering digunakan dalam kode multithreaded, seperti kumpulan koneksi database. Untuk detail lebih lanjut, silakan klik di sini.
37) Jika Anda mengirimkan tugas, antrian kumpulan utas penuh. Apa yang terjadi saat itu terjadi?
Pertanyaan ini licik dan banyak programmer akan berpikir bahwa tugas akan diblokir sampai antrian kumpulan utas memiliki ruang. Bahkan, jika suatu tugas tidak dapat dijadwalkan untuk dieksekusi, metode ThreadPoolExecutor's Kirim () akan melempar pengecualian ExcutionException yang ditolak.
38) Apa perbedaan antara metode submit () dan execute () di java thread pool?
Kedua metode dapat mengirimkan tugas ke kumpulan utas. Jenis pengembalian metode execute () batal, yang didefinisikan dalam antarmuka eksekutor, dan metode submit () dapat mengembalikan objek di masa depan yang memegang hasil perhitungan. Itu didefinisikan dalam antarmuka ExecutorService. Itu memperluas antarmuka pelaksana. Kelas kumpulan utas lainnya seperti ThreadPoolExecutor dan JadwalTHreadPoolExecutor memiliki metode ini. Untuk detail lebih lanjut, silakan klik di sini.
39) Apa itu metode pemblokiran?
Metode pemblokiran berarti bahwa program akan menunggu metode untuk menyelesaikan dan tidak melakukan hal lain. Metode penerimaan server () adalah menunggu klien untuk terhubung. Pemblokiran di sini berarti bahwa utas saat ini akan ditangguhkan sebelum hasil panggilan dikembalikan dan tidak akan kembali sampai hasilnya diperoleh. Selain itu, ada metode asinkron dan non-blocking yang kembali sebelum tugas selesai. Untuk detail lebih lanjut, silakan klik di sini.
40) Apakah swing-aman-aman? Mengapa?
Anda dapat memberikan jawaban yang positif, ayunan tidak aman, tetapi Anda harus menjelaskan mengapa jawaban ini bahkan jika pewawancara tidak bertanya mengapa. Ketika kita mengatakan ayunan tidak aman-utas, itu sering menyebutkan komponennya, yang tidak dapat dimodifikasi dalam multi-utas. Semua pembaruan untuk komponen GUI harus diselesaikan dalam utas AWT. Swing menyediakan dua metode panggilan balik sinkron dan asinkron untuk diperbarui. Klik di sini untuk melihat lebih banyak konten terkait Swing dan Thread Safety.
41) Apa perbedaan antara Invokeandwait dan Invokelater di Jawa?
Kedua metode ini disediakan oleh pengembang ayunan API ke Java untuk memperbarui komponen GUI dari utas saat ini daripada utas pengiriman acara. Invokeandwait () secara sinkron memperbarui komponen GUI, seperti bilah kemajuan. Setelah kemajuan diperbarui, bilah kemajuan juga harus diubah sesuai. Jika kemajuan dilacak oleh beberapa utas, maka metode invokeandwait () dipanggil untuk meminta utas pengiriman acara untuk memperbarui komponen yang sesuai. Metode Invokelater () disebut secara tidak sinkron untuk memperbarui komponen. Untuk detail lebih lanjut, silakan klik di sini.
42) Metode apa dalam API ayunan yang aman?
Pertanyaan ini juga menyebutkan keselamatan ayunan dan benang. Meskipun komponen tidak aman-utas, ada beberapa metode yang dapat disebut multi-threadable, seperti mengecat ulang () dan revalidate (). Metode settext () dari JTextComponent dan metode insert () dan append () dari JTextArea juga aman-utas.
43) Bagaimana cara membuat objek yang tidak dapat diubah di Java?
Masalah ini tampaknya tidak ada hubungannya dengan multi-threading, tetapi invarian membantu menyederhanakan program bersamaan yang sudah kompleks. Objek yang tidak dapat diubah dapat dibagikan tanpa sinkronisasi, mengurangi overhead sinkronisasi ketika akses bersamaan ke objek. Namun, Java tidak memiliki anotasi @mutable. Untuk membuat kelas yang tidak dapat diubah, kita perlu mengimplementasikan langkah -langkah berikut: inisialisasi semua anggota melalui konstruktor, jangan memberikan metode setter ke variabel, dan nyatakan semua anggota sebagai pribadi, sehingga anggota ini tidak diizinkan diakses secara langsung. Dalam metode Getter, jangan langsung mengembalikan objek itu sendiri, tetapi klon objek dan mengembalikan salinan objek. Artikel saya cara membuat objek diubah di Java memiliki tutorial terperinci, dan Anda bisa penuh percaya diri setelah membacanya.
44) Apa itu ReadWritelock di Java?
Secara umum, baca dan tulis kunci adalah hasil dari teknologi pemisahan kunci yang digunakan untuk meningkatkan kinerja program bersamaan. ReadWritelock di Java adalah antarmuka baru yang ditambahkan dalam Java 5. A ReadWritelock memelihara sepasang kunci terkait, satu untuk operasi hanya baca dan satu untuk menulis. Kunci baca dapat dipegang oleh beberapa utas baca secara bersamaan tanpa utas tulis. Write Locks adalah eksklusif, Anda dapat mengimplementasikan aturan ini menggunakan ReentrantReadWritelock di JDK, yang mendukung hingga 65535 Write Locks dan 65535 baca kunci.
45) Apa loop sibuk dalam multithreading?
Loop yang sibuk adalah saat programmer menggunakan loop untuk membuat utas menunggu. Tidak seperti metode tradisional seperti tunggu (), sleep () atau imbal hasil (), mereka semua melepaskan kontrol CPU, sementara loop yang sibuk tidak menyerah CPU, itu hanya menjalankan loop kosong. Tujuan dari ini adalah untuk melestarikan cache CPU. Dalam sistem multi-core, satu menunggu utas bangun dapat berjalan di kernel lain, yang akan membangun kembali cache. Ini tersedia untuk menghindari pembangunan kembali cache dan mengurangi waktu menunggu pembangunan kembali. Anda dapat memeriksa artikel ini untuk informasi lebih lanjut.
46) Apa perbedaan antara variabel volatil dan variabel atom?
Ini adalah pertanyaan yang menarik. Pertama, variabel volatil terlihat sangat mirip dengan variabel atom, tetapi fungsinya berbeda. Variabel yang mudah menguap memastikan hubungan pendahulunya, yaitu, operasi tulis akan terjadi sebelum operasi baca berikutnya, tetapi tidak menjamin atomisitas. Misalnya, memodifikasi variabel hitungan dengan volatile, maka operasi penghitungan ++ bukan atom. Metode atom yang disediakan oleh kelas AtomicInteger dapat membuat operasi atom ini. Misalnya, metode getAndIncrement () akan melakukan operasi kenaikan atom untuk menambahkan nilai saat ini dengan satu, dan tipe data lainnya serta variabel referensi juga dapat melakukan operasi yang serupa.
47) Apa yang terjadi jika utas dalam blok sinkronisasi melempar pengecualian?
Pertanyaan ini telah menipu banyak programmer Java. Jika Anda dapat memikirkan apakah kunci melepaskan petunjuk ini untuk dijawab, Anda masih berharap untuk menjawabnya dengan benar. Tidak peduli apakah blok sinkronisasi Anda keluar secara normal atau tidak normal, utas di dalamnya akan melepaskan kunci, jadi saya lebih suka blok sinkronisasi dibandingkan dengan antarmuka kunci karena tidak mengharuskan saya menghabiskan energi saya untuk melepaskan kunci. Fungsi ini dapat diimplementasikan dengan melepaskan kunci di akhirnya blok.
48) Apa kunci pemeriksaan ganda dalam mode singleton?
Pertanyaan ini sering ditanyakan dalam wawancara Java, tetapi pewawancara hanya 50% puas dengan menjawab pertanyaan ini. Setengah dari orang tidak dapat menulis kunci cek ganda dan setengah dari orang tidak bisa mengatakan itu bahaya tersembunyi dan bagaimana Java 1.5 mengoreksinya. Ini sebenarnya adalah metode lama untuk membuat singleton yang aman. Ketika instance singleton pertama kali dibuat, ia mencoba mengoptimalkan kinerja dengan satu kunci, tetapi karena terlalu rumit, ia gagal dalam JDK1.4, dan saya pribadi juga tidak menyukainya. Bagaimanapun, bahkan jika Anda tidak menyukainya, Anda masih harus memahaminya karena sering ditanyakan. Anda dapat memeriksa bagaimana penguncian ganda yang diperiksa pada artikel Singleton Works untuk informasi lebih lanjut.
49) Bagaimana cara membuat singleton yang aman di java?
Ini adalah tindak lanjut dari pertanyaan di atas. Jika Anda tidak menyukai kunci periksa ganda dan pewawancara bertanya tentang metode alternatif untuk membuat kelas singleton, Anda dapat menggunakan fitur inisialisasi pemuatan kelas JVM dan variabel statis untuk membuat instance singleton, atau menggunakan jenis enumerasi untuk membuat singleton. Saya suka metode ini. Anda dapat memeriksa artikel ini untuk informasi lebih lanjut.
50) Tulis 3 praktik terbaik multithreading yang Anda ikuti
Saya paling menyukai masalah seperti ini, dan saya yakin Anda akan mengikuti praktik terbaik tertentu saat menulis kode bersamaan untuk meningkatkan kinerja. Berikut adalah tiga praktik terbaik yang saya pikir sebagian besar programmer Java harus mengikuti:
Beri utas Anda nama yang bermakna.
Ini membuatnya mudah untuk menemukan bug atau melacaknya. OrderProcessor, Quoteprocessor atau Tradeprocessor Nama ini jauh lebih baik daripada Thread-1. Thread-2 dan Thread-3. Berikan nama utas yang terkait dengan tugas yang ingin diselesaikannya. Semua kerangka kerja besar dan bahkan JDK mengikuti praktik terbaik ini.
Hindari mengunci dan mempersempit ruang lingkup sinkronisasi
Kunci mahal dan switching konteks lebih memakan waktu. Coba gunakan sinkronisasi dan kunci untuk meminimalkan area kritis. Jadi saya lebih suka blok sinkronisasi daripada metode sinkronisasi, yang memberi saya kontrol absolut atas kunci.
Gunakan lebih banyak kelas sinkronisasi dan gunakan lebih sedikit tunggu dan beri tahu
Pertama, CountdownLatch, Semaphore, Cyclicbarrier dan penukar kelas sinkron menyederhanakan operasi pengkodean, sementara sulit untuk mengontrol aliran kontrol yang kompleks dengan menunggu dan memberi tahu. Kedua, kelas -kelas ini ditulis dan dikelola oleh perusahaan terbaik. Mereka akan terus dioptimalkan dan ditingkatkan di JDK berikutnya. Dengan menggunakan alat sinkronisasi tingkat lebih tinggi ini, program Anda dapat dioptimalkan tanpa upaya apa pun.
Gunakan set yang lebih bersamaan dan set yang kurang disinkronkan. Ini adalah praktik terbaik yang mudah diikuti. Set bersamaan lebih terukur daripada set yang disinkronkan, jadi menggunakan set bersamaan lebih baik untuk pemrograman bersamaan. Jika Anda perlu menggunakan peta lain kali, Anda harus terlebih dahulu berpikir untuk menggunakan ConcurrhenthMap. Artikel saya Java Concurrent Collections memiliki deskripsi yang lebih rinci.
51) Bagaimana cara memaksa startup utas?
Masalah ini seperti cara memaksa koleksi sampah java. Belum ada cara untuk melakukannya. Meskipun Anda dapat menggunakan System.gc () untuk melakukan pengumpulan sampah, itu tidak dijamin akan berhasil. Tidak ada cara untuk memaksa utas untuk memulai di Java, itu dikendalikan oleh penjadwal utas dan Java tidak mempublikasikan API yang relevan.
52) Apa kerangka kerja gabungan garpu di java?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。