Sebuah ReentrantLock adalah tidak terstruktur , tidak seperti synchronized
konstruksi - yaitu Anda tidak perlu menggunakan struktur blok untuk mengunci dan bahkan dapat memegang kunci di seluruh metode. Sebuah contoh:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
Aliran seperti itu tidak mungkin untuk diwakili melalui monitor tunggal dalam suatu synchronized
konstruksi.
Selain itu, ReentrantLock
mendukung polling kunci dan kunci interruptible menunggu yang mendukung time-out . ReentrantLock
juga memiliki dukungan untuk kebijakan keadilan yang dapat dikonfigurasi , memungkinkan penjadwalan thread yang lebih fleksibel.
Konstruktor untuk kelas ini menerima parameter keadilan opsional . Ketika ditetapkantrue
, di bawah pertentangan, kunci mendukung pemberian akses ke utas terlama. Kalau tidak, kunci ini tidak menjamin urutan akses tertentu. Program menggunakan kunci yang adil diakses oleh banyak utas mungkin menampilkan throughput keseluruhan yang lebih rendah (yaitu, lebih lambat; sering jauh lebih lambat) daripada yang menggunakan pengaturan default, tetapi memiliki varians yang lebih kecil di kali untuk mendapatkan kunci dan menjamin kurangnya kelaparan. Namun perlu dicatat bahwa keadilan kunci tidak menjamin keadilan penjadwalan utas. Dengan demikian, salah satu dari banyak utas yang menggunakan kunci adil dapat memperolehnya beberapa kali berturut-turut sementara utas aktif lainnya tidak mengalami kemajuan dan saat ini tidak memegang kunci. Perhatikan juga bahwa waktutryLock
Metode tidak menghormati pengaturan keadilan. Ini akan berhasil jika kunci tersedia bahkan jika utas lain sedang menunggu.
ReentrantLock
mungkin juga lebih skalabel , berkinerja jauh lebih baik di bawah pertengkaran yang lebih tinggi. Anda dapat membaca lebih lanjut tentang ini di sini .
Namun klaim ini telah diperdebatkan; lihat komentar berikut:
Dalam uji kunci reentrant, kunci baru dibuat setiap kali, sehingga tidak ada penguncian eksklusif dan data yang dihasilkan tidak valid. Juga, tautan IBM tidak menawarkan kode sumber untuk tolok ukur yang mendasarinya sehingga tidak mungkin untuk mengkarakterisasi apakah pengujian bahkan dilakukan dengan benar.
Kapan sebaiknya Anda gunakan ReentrantLock
s? Menurut artikel developerWorks itu ...
Jawabannya cukup sederhana - gunakan ketika Anda benar-benar membutuhkan sesuatu yang tidak disediakannya synchronized
, seperti menunggu kunci waktu, kunci menunggu interruptible, kunci non-blok-terstruktur, beberapa variabel kondisi, atau polling kunci. ReentrantLock
juga memiliki manfaat skalabilitas, dan Anda harus menggunakannya jika Anda benar-benar memiliki situasi yang menunjukkan pertikaian tinggi, tetapi ingat bahwa sebagian besar synchronized
blok hampir tidak pernah menunjukkan pertengkaran apa pun, apalagi pertengkaran tinggi. Saya akan menyarankan pengembangan dengan sinkronisasi sampai sinkronisasi terbukti tidak memadai, daripada hanya mengasumsikan "kinerja akan lebih baik" jika Anda menggunakanReentrantLock
. Ingat, ini adalah alat canggih untuk pengguna tingkat lanjut. (Dan pengguna yang benar-benar mahir cenderung lebih suka alat paling sederhana yang dapat mereka temukan sampai mereka yakin alat sederhana tidak memadai.) Seperti biasa, perbaiki dulu, lalu khawatir apakah Anda harus membuatnya lebih cepat atau tidak.