Rumah  >  Artikel  >  Java  >  Apakah penggunaan dan kelebihan kunci baca-tulis Java?

Apakah penggunaan dan kelebihan kunci baca-tulis Java?

WBOY
WBOYke hadapan
2023-04-20 15:25:08846semak imbas
Kata Pengantar:

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.

1. Penggunaan kunci baca-tulis

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();
}

1.1 Membaca tidak saling eksklusif

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:

Apakah penggunaan dan kelebihan kunci baca-tulis Java?

1.2 Baca dan tulis saling pengecualian

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:

Apakah penggunaan dan kelebihan kunci baca-tulis Java?

1.3 Tulis-tulis pengecualian bersama

Berbilang 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:

Apakah penggunaan dan kelebihan kunci baca-tulis Java?

2. Analisis kelebihan

  • Peningkatan 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.

3. Senario terpakai

Kunci baca-tulis sesuai untuk senario perniagaan dengan lebih banyak membaca dan kurang menulis pada masa ini, kunci baca-tulis mempunyai kelebihan terbesar .

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam