Sebagai alat untuk berbagi data secara bersamaan dan memastikan konsistensi, kunci memiliki banyak implementasi pada platform JAVA (seperti tersinkronisasi dan ReentrantLock, dll.). Kunci yang sudah tertulis ini memberikan kemudahan bagi pengembangan kami, namun sifat spesifik dan jenis kunci jarang disebutkan. Rangkaian artikel ini akan menganalisis nama dan karakteristik kunci umum di JAVA untuk menjawab pertanyaan Anda.
kunci pemblokiran
Kunci pemblokiran, tidak seperti kunci putaran, mengubah status thread yang sedang berjalan.
Di lingkungan JAVA, thread Thread memiliki status berikut:
1. Negara bagian baru
2. Keadaan siap
3. Status berjalan
4. Status diblokir
5. Keadaan kematian
Kunci pemblokiran dapat dikatakan memungkinkan thread memasuki status pemblokiran dan menunggu. Ketika sinyal yang sesuai (bangun, waktu) diperoleh, thread dapat memasuki status siap. Semua thread dalam status siap memasuki status berjalan melalui kompetisi.
Di JAVA, metode yang dapat masuk/keluar, status blok, atau berisi kunci pemblokiran meliputi, kata kunci tersinkronisasi (di antaranya kunci berat), ReentrantLock, Object.wait()/notify(), LockSupport.park()/unpart()( juc sering digunakan)
Berikut ini contoh kunci pemblokiran JAVA:
kunci paket;impor java.util.concurrent.atomic.AtomicReferenceFieldUpdater;impor java.util.concurrent.locks.LockSupport;kelas publik CLHLock1 { public static class CLHNode { private volatil Thread isLocked; } @SuppressWarnings("tidak digunakan") CLHNode volatil pribadi tail; final statis pribadi ThreadLocal<CLHNode> LOCAL = baru ThreadLocal<CLHNode>(); AtomicReferenceFieldUpdater akhir statis pribadi<CLHLock1, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock1.class, CLHNode.class, "tail"); public void lock() { CLHNode node = new CLHNode(); .set(simpul);CLHNode preNode = UPDATER.getAndSet(ini, simpul); if (preNode != null) { preNode.isLocked = Thread.currentThread(); LockSupport.park(ini); void unlock() { CLHNode node = LOCAL.get(); null)) { System.out.println("unlock/t" + node.isLocked.getName()); LockSupport.unpark(node.isLocked);
Di sini kita menggunakan kunci pemblokiran LockSupport.unpark(). Contoh ini dimodifikasi dari kunci CLH.
Keuntungan dari kunci pemblokiran adalah bahwa thread yang diblokir tidak akan memakan waktu CPU dan tidak akan menyebabkan penggunaan CPU yang berlebihan, namun waktu masuk dan waktu pemulihan sedikit lebih lambat dibandingkan kunci putaran.
Dalam kasus persaingan yang ketat, kinerja kunci pemblokiran jauh lebih tinggi dibandingkan dengan kunci putar.
Situasi yang ideal adalah; gunakan kunci putaran ketika persaingan benang tidak sengit, dan gunakan kunci pemblokiran ketika persaingan sangat ketat.
(Teks lengkap berakhir)