1. Algoritma non-pemblokiran
Algoritme non-pemblokiran adalah algoritme serentak yang dapat dengan aman memunculkan threadnya bukan melalui pemijahan kunci, namun melalui bentuk atomisitas asli perangkat keras tingkat rendah - seperti perbandingan dan pertukaran. Algoritme non-pemblokiran sangat sulit untuk dirancang dan diimplementasikan, namun algoritma ini dapat memberikan throughput yang lebih baik dan pertahanan yang lebih baik terhadap masalah kelangsungan hidup seperti kebuntuan dan inversi prioritas. Gunakan instruksi mesin atom tingkat rendah untuk mengganti kunci, seperti bandingkan-dan-swap (CAS).
2. Teknologi pesimis
Penguncian eksklusif adalah teknik pesimistis. Teknik ini mengasumsikan bahwa skenario terburuk terjadi (jika kunci tidak dikunci, thread lain akan menghancurkan status objek), dan bahkan jika skenario terburuk tidak terjadi, status objek masih dilindungi oleh sebuah kunci.
3. Teknologi optimis
Pemantauan konflik ketergantungan. Perbarui terlebih dahulu. Jika konflik terjadi selama pemantauan, hentikan pembaruan dan coba lagi, jika tidak, pembaruan berhasil. Sekarang prosesor memiliki instruksi baca-modifikasi-tulis atom, seperti bandingkan-dan-tukar (CAS, bandingkan -dan- bertukar).
4. Operasi CAS
CAS memiliki 3 operan, nilai memori V, nilai lama yang diharapkan A, dan nilai baru yang akan dimodifikasi B. Jika dan hanya jika nilai yang diharapkan A dan nilai memori V sama, ubah nilai memori V menjadi B, jika tidak, jangan lakukan apa pun. Pola penggunaan khas CAS adalah: pertama baca A dari V, dan hitung nilai baru B berdasarkan A, lalu gunakan CAS untuk mengubah nilai V secara atom dari A ke B (selama tidak ada thread yang mengubah nilai V selama periode ini) nilai ke nilai lain).
Listing 3. Kode yang mengilustrasikan perilaku (tetapi bukan kinerja) dari perbandingan-dan-swap Salin kode di bawah ini:
SimulasiCAS kelas publik {
nilai int pribadi;
publik disinkronkan int getValue() { nilai kembalian;
publik disinkronkan int bandingkanAndSwap(int ExpectValue, int newValue) {
int nilai lama = nilai;
jika (nilai == Nilai yang diharapkan)
nilai = Nilai baru;
kembalikan Nilai lama;
}
}
Listing 4. Gunakan perbandingan dan pertukaran untuk mengimplementasikan kode counter copy. Kodenya adalah sebagai berikut:
CasCounter kelas publik {
nilai SimulatedCAS pribadi;
publik int getValue() {
mengembalikan nilai.getValue();
}
kenaikan int publik() {
int nilailama = nilai.getValue();
sementara (nilai.compareAndSwap(oldValue, oldValue + 1) != oldValue)
oldValue = nilai.getValue();
kembalikan nilai lama + 1;
}
}
5. Variabel atom
Variabel atom mendukung operasi pembaruan atom tanpa perlindungan kunci, dan lapisan dasarnya diimplementasikan menggunakan CAS. Total ada 12 variabel atom, yang dapat dibagi menjadi 4 kelompok: kelas skalar, kelas pembaru, kelas array, dan kelas variabel komposit. Variabel atom yang paling umum digunakan adalah kelas skalar: AtomicInteger, AtomicLong, AtomicBoolean, dan AtomicReference. CAS didukung pada semua jenis.
6. Perbandingan kinerja: kunci dan variabel atom
Dalam pertikaian rendah hingga sedang, variabel atom dapat memberikan skalabilitas tinggi, dan kinerja variabel atom melebihi kinerja kunci; dalam pertikaian intensitas tinggi, kunci dapat menghindari pertikaian secara lebih efektif, dan kinerja kunci akan melebihi kinerja atom. variabel. Namun dalam situasi praktis yang lebih realistis, kinerja variabel atom akan melebihi kinerja kunci.