Kunci Pembaca-Penulis, seperti namanya, ialah kunci yang dibahagikan kepada dua bahagian: kunci baca dan kunci tulis dibenarkan berbilang Benang memperolehnya pada masa yang sama, kerana operasi baca itu sendiri adalah selamat untuk benang, dan kunci tulis ialah kunci pengecualian bersama Berbilang benang tidak dibenarkan untuk mendapatkan kunci tulis pada masa yang sama, dan operasi tulis serta operasi baca juga saling eksklusif. Secara ringkasnya, ciri-ciri kunci baca-tulis ialah: membaca dan membaca tidak saling eksklusif, membaca dan menulis adalah saling eksklusif, dan menulis dan menulis adalah saling eksklusif.
Dalam bahasa Java, kunci baca-tulis dilaksanakan menggunakan kelas ReentrantReadWriteLock, di mana:
ReentrantReadWriteLock.ReadLock
bermaksud kunci baca, yang menyediakan kaedah kunci untuk mengunci dan kaedah buka kunci untuk membuka kunci.
ReentrantReadWriteLock.WriteLock
mewakili kunci tulis, yang menyediakan kaedah kunci untuk mengunci dan kaedah buka kunci untuk membuka kunci.
Penggunaan asasnya adalah seperti yang ditunjukkan dalam kod berikut:
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 获得读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); // 获得写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); // 读锁使用 readLock.lock(); try { // 业务代码... } finally { readLock.unlock(); } // 写锁使用 writeLock.lock(); try { // 业务代码... } finally { writeLock.unlock(); }
Berbilang urutan boleh memperoleh kunci baca pada masa yang sama, yang dipanggil baca dan baca pengecualian bukan bersama, seperti yang ditunjukkan dalam kod berikut:
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); Thread t1 = new Thread(() -> { readLock.lock(); try { System.out.println("[t1]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放读锁."); readLock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { readLock.lock(); try { System.out.println("[t2]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放读锁."); readLock.unlock(); } }); t2.start();
Pelaksanaan keputusan program di atas adalah seperti berikut:
Kunci baca dan tulis adalah saling eksklusif (iaitu, mereka tidak boleh diperoleh pada masa yang sama) apabila digunakan pada masa yang sama Ini dipanggil Ia adalah saling eksklusif untuk membaca dan menulis, seperti yang ditunjukkan dalam kod berikut:
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建读锁 final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock(); // 创建写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); // 使用读锁 Thread t1 = new Thread(() -> { readLock.lock(); try { System.out.println("[t1]得到读锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放读锁."); readLock.unlock(); } }); t1.start(); // 使用写锁 Thread t2 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t2]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放写锁."); writeLock.unlock(); } }); t2.start();
Hasil pelaksanaan program di atas adalah seperti berikut:
1.3 Tulis-tulis pengecualian bersamaBerbilang rangkaian menggunakan kunci tulis pada masa yang sama juga saling eksklusif Ini dipanggil pengecualian bersama tulis-tulis, seperti yang ditunjukkan dalam kod berikut:
// 创建读写锁 final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); // 创建写锁 final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock(); Thread t1 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t1]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t1]释放写锁."); writeLock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { writeLock.lock(); try { System.out.println("[t2]得到写锁."); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println("[t2]释放写锁."); writeLock.unlock(); } }); t2.start();
Hasil pelaksanaan program di atas. adalah seperti berikut:
2. Analisis kelebihanPeningkatan prestasi pelaksanaan Program: Pelbagai. kunci baca boleh dilaksanakan pada masa yang sama Berbanding dengan kunci biasa yang mesti beratur untuk pelaksanaan dalam apa jua keadaan, kunci baca-tulis meningkatkan prestasi pelaksanaan program.
Elakkan membaca data sementara: Kunci baca dan kunci tulis adalah saling eksklusif dan beratur untuk pelaksanaan, yang memastikan operasi baca tidak akan separuh dibaca dan ditulis data sementara.
Atas ialah kandungan terperinci Apakah penggunaan dan kelebihan kunci baca-tulis Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!