Di Java, kata kunci yang disinkronkan dan kunci kunci digunakan untuk mewujudkan kontrol akses sumber daya secara bersamaan. Hanya utas unik yang diizinkan untuk memasuki area kritis untuk mengakses sumber daya (kecuali kunci baca). Tujuan utama dari sub-kontrol ini adalah untuk menyelesaikan masalah inkonsistensi data yang disebabkan oleh banyak utas secara bersamaan dengan sumber daya yang sama. Dalam skenario lain, sumber daya memiliki banyak salinan untuk digunakan pada saat yang sama, seperti beberapa printer di ruang printer, dan beberapa lubang untuk digunakan pada saat yang sama. Dalam hal ini, Java menyediakan kontrol akses bersamaan lainnya - kontrol akses bersamaan untuk banyak salinan sumber daya, dan semaphore yang digunakan saat ini adalah salah satunya.
Java dapat mendeteksi potensi masalah keamanan utas dalam sistem kami dengan cara tercepat melalui simulasi kode. Di sini, Semaphore (Semaphore) dan Countdownlatch (Locking) digunakan dengan ExecutorService (Thread Pool) untuk simulasi. Pendahuluan utama adalah sebagai berikut:
1. Semaphore
Kelas ini akan disediakan setelah JDK 1.5
Semaphore adalah semaphore berbasis hitung. Ini dapat menetapkan ambang batas, berdasarkan ini, beberapa utas bersaing untuk mendapatkan sinyal lisensi, dan mengembalikannya setelah membuat aplikasi sendiri. Setelah melebihi ambang batas, aplikasi utas untuk sinyal lisensi akan diblokir. Semaphore dapat digunakan untuk membangun beberapa kumpulan objek, kumpulan sumber daya, dll., Seperti kumpulan koneksi database. Kami juga dapat membuat semaphore dengan hitungan 1, menggunakannya sebagai mekanisme yang mirip dengan kunci mutex. Ini juga disebut semaphore biner, menunjukkan dua status mutex.
2. Countdownlatch
Kelas ini akan disediakan setelah JDK 1.5.
Kelas Countdownlatch dapat membuat utas menunggu utas lain untuk menyelesaikan pekerjaan masing -masing sebelum dieksekusi. Misalnya, utas utama aplikasi ingin dieksekusi setelah utas yang bertanggung jawab untuk memulai layanan kerangka kerja telah memulai semua layanan kerangka kerja.
Countdownlatch diimplementasikan melalui penghitung, dan nilai awal penghitung adalah jumlah utas. Setiap kali utas menyelesaikan tugasnya sendiri, nilai penghitung dikurangi 1. Ketika nilai penghitung mencapai 0, itu berarti bahwa semua utas telah menyelesaikan tugas, dan kemudian utas yang menunggu pada kunci dapat melanjutkan pelaksanaan tugas.
Seperti yang ditunjukkan pada gambar di bawah ini:
Dua kelas di atas dapat digunakan dalam kombinasi untuk mencapai efek mensimulasikan konkurensi tinggi. Kode berikut digunakan untuk memberikan contoh:
Modul Paket; Impor java.util.concurrent.countdownlatch; impor java.util.concurrent.executorservice; import java.util.concurrent.executors; impor java.util.concurrent.semaphore; classample kelas publik {// Total jumlah public intercurrent.semaphore; classample kelas public {// Total jumlah permintaan public static static klien; classample class countexample {// Total jumlah permintaan public static static klien; // Jumlah utas yang dieksekusi secara bersamaan pada saat yang sama int threadtotal statis publik = 200; Public Static Int Count = 0; public static void main (string [] args) melempar Exception {ExecutorService ExecutorService = executors.newCachedThreadPool (); // semikonduktor, digunakan untuk mengontrol jumlah utas bersamaan di sini semaphore akhir semaphore = semaphore baru (threadtotal); // penguncian, yang dapat mewujudkan penurunan counter countdownlatch countDownlatch = countdownlatch baru (clienttotal); untuk (int i = 0; i <clienttotal; i ++) {executorservice.execute (() -> {coba {// Jalankan metode ini untuk mendapatkan izin eksekusi. Ketika jumlah total lisensi yang belum dirilis tidak melebihi (// izin lulus, jika tidak, blok utas dan tunggu hingga lisensi diperoleh. Semaphore.acquire () () (jika tidak, LIET () (() ((() (() (), LIEM () (NEGARA () (NEGARA () (NEGARA () (NEGARA ((NEGARA LIASE (NEGARA (NEGARA (NEGARA ((NEGARA NOMA () (Exception e) {//log.error("exception ", e); } countDownlatch.AWAIT (); // Blok utas, dan blok tidak dirilis sampai nilai kunci adalah 0. Lanjutkan untuk mengeksekusi ExecutorService.shutdown (); log.info ("count: {}", count); } private static void add () {count ++; }}Seperti yang ditunjukkan dalam metode di atas, 5000 permintaan disimulasikan, dan 200 operasi bersamaan mencapai 200 operasi bersamaan secara bersamaan. Amati hasil akhir dan temukan bahwa hasilnya berbeda untuk setiap kali dan tidak konsisten dengan harapan. Hasilnya adalah sebagai berikut:
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 4997
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 4995
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 4998
Kesimpulan Akhir: Metode Tambah tidak aman
Lalu bagaimana memastikan keamanan utas dari metode tambah, ubah metode tambah sebagai berikut:
private static void add () {count.incrementandget ();}Hasil eksekusi adalah sebagai berikut:
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
22: 18: 26.449 [Utama] Modul Info.CountExample - Hitung: 5000
Kesimpulan Akhir: Metode Tambah Metode yang Modifikasi-Safe
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.