Sebelum java5.0, hanya disinkronkan (kunci -in -dalam) dan volatile.
Tinjauan Reentrantlock
Reentrantlock adalah kunci yang masuk kembali. Tanyakan kunci.
Antarmuka kunci:
Salin kode kode sebagai berikut:
kunci antarmuka publik {
// blokir sampai kunci atau interupsi
void lock ();
// membutakannya sampai kunci atau interupsi tidak normal
void lockerTericly () melempar interrupted exception;
// Hanya jika kunci tersedia, itu akan diperoleh, jika tidak, ia akan kembali secara langsung
boolean trylock ();
// Hanya ketika kunci tersedia dalam waktu yang ditentukan, itu akan diperoleh, jika tidak akan dikembalikan secara langsung.
Boolean Trylock (lama, unit TimeUnit) melempar interruptedException;
void unlock ();
// mengembalikan kondisi yang terikat pada kunci ini
Kondisi newcondition ();
}
Kunci
Salin kode kode sebagai berikut:
Lock lock = baru reentrantlock ();
lock.lock ();
mencoba {
// Perbarui status objek
} Akhirnya {
// Catatan di sini, pastikan untuk memiliki blok kode akhir untuk membuka kunci
// Jika tidak, mudah untuk menyebabkan masalah aktif seperti kunci mati
lock.unlock ();
}
Fitur Rentrantlock
Kunci berputar dan kunci biasa
Permintaan yang tersedia dan waktu diimplementasikan melalui metode trylock (), yang berbeda dari mendapatkan kunci dalam bidang tanpa syarat. Ketika kunci diblokir, dan tidak melepaskan kunci yang sudah Anda pegang, METODE MATI. Kunci sendiri setelah kembali.
Keadilan
Konstruktor Reentrantlock menyediakan dua opsi: kunci adil dan kunci non -fair (default). Kunci adil yang disebut SO, utas akan mendapatkan kunci dalam urutan permintaan mereka, tidak diizinkan untuk dimasukkan; Kunci, jika kunci ini tersedia, maka utas ini akan melewatkan utas menunggu dalam antrian dan dikunci. Kami umumnya berharap bahwa semua kunci tidak fair. Karena ketika operasi kunci dieksekusi, keadilan akan dikatakan mengurangi kinerja karena benang menggantung dan memulihkan overhead benang. Pertimbangkan situasi seperti itu: Thread A memegang kunci, dan utas B meminta kunci ini, jadi benang B digantung; C kemungkinan akan mendapatkan, menggunakan, dan melepaskan kunci sebelum utas B benar -benar terbangun. Ini adalah situasi kemenangan. Dalam kebanyakan kasus, kinerja kunci non -fair lebih tinggi dari kinerja kunci yang adil.
Operasi mendapatkan yang dapat dipotong
Metode LockerTericribly dapat mempertahankan respons terhadap interupsi sambil mendapatkan kunci, jadi tidak perlu membuat jenis lain dari operasi obstruksi non -gangguan.
Readwritelock
Rentrantlock adalah standar yang saling mengunci, dan hanya satu utas yang dapat menahan kunci paling banyak sekaligus. Kunci membaca dan menulis berbeda, dan dua objek kunci terpapar, salah satunya digunakan untuk operasi membaca, dan yang lainnya digunakan untuk menulis operasi.
Salin kode kode sebagai berikut:
Antarmuka publik readwritelock {
/**
* Mengembalikan penggunaan kunci untuk dibaca.
*
* @Keturn The Lock Userd untuk dibaca.
*/
Kunci readlock ();
/**
* Mengembalikan penggunaan kunci untuk menulis.
*
* @Kembalinya Kunci Penggunaan untuk Menulis.
*/
Lock Writing ();
}
Dapat memilih untuk mengimplementasikan:
1. Prioritas rilis
2. Baca potongan utas
3. Pengulangan
4. Janda
5. Tingkatkan
RentRantReadWritelock mengimplementasikan antarmuka ReadWritelock, dan konstruktor menyediakan dua metode pembuatan: kunci adil dan kunci non -fair. Kunci membaca dan menulis cocok untuk membaca lebih lanjut dan lebih sedikit menulis, yang dapat mencapai konkurensi yang lebih baik.
Contoh Kode Kode Salin adalah sebagai berikut:
Kelas publik readwritemap <k, v> {{
Peta pribadi <k, v> peta;
Private final readwritelock lock = baru reentrantreadwritelock ();
Private final lock readlock = lock.readlock ();
Private final lockwritlock = lock.writelock ();
Public ReadWrItemap (peta <k, v> peta) {
this.map = peta;
}
public v get (k key) {
Readlock.lock ();
mencoba {
Return map.get (key);
} Akhirnya {
Readlock.unlock ();
}
}
public void put (k kunci, nilai v) {
writelock.lock ();
mencoba {
peta.put (tombol, nilai);
} Akhirnya {
writelock.unlock ();
}
}
}