ホームページ  >  記事  >  Java  >  Java 読み取り/書き込みロックの使用法と利点は何ですか?

Java 読み取り/書き込みロックの使用法と利点は何ですか?

WBOY
WBOY転載
2023-04-20 15:25:08846ブラウズ
前書き:

Readers-Writer Lock (Readers-Writer Lock) は、名前が示すとおり、読み取りロックと書き込みロックの 2 つの部分に分かれたロックです。ロック。読み取り操作自体はスレッドセーフであり、書き込みロックは相互排他ロックであるため、読み取りロックでは複数のスレッドが同時にロックを取得できます。複数のスレッドが同時に書き込みロックを取得することはできません。また、書き込み操作と読み取り操作も相互に排他的です。要約すると、読み取り-書き込みロックの特性は次のとおりです。 読み取り-読み取りは相互排他的ではなく、読み取り-書き込みは相互排他的であり、書き込み-書き込みは相互排他的です

1. 読み取り/書き込みロックの使用

Java 言語では、読み取り/書き込みロックは ReentrantReadWriteLock クラスを使用して実装されます。

##ReentrantReadWriteLock.ReadLock
    は読み取りロックを表し、ロックのための lock メソッドとロック解除のための lock メソッドを提供します。
  • ReentrantReadWriteLock.WriteLock
  • は書き込みロックを表し、ロックのための lock メソッドとロック解除のための lock メソッドを提供します。
  • # その基本的な使用法は次のコードに示すとおりです。

  • // 创建读写锁
    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 読み取りは相互に排他的ではありません

# #Multiple 次のコードに示すように、2 つのスレッドが同時に読み取りロックを取得できます。これは読み取りと読み取りの非相互排他と呼ばれます。

// 创建读写锁
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();

上記のプログラムは次のとおりです。

1.2 読み取りと書き込みの相互排他

読み取りロックと書き込みロックは、次の場所で使用される場合、相互に排他的です。これは、読み取りと書き込みの相互排他と呼ばれます。次のコードに示すように、排他は次のとおりです。プログラムの実行結果は次のとおりです。 Java 読み取り/書き込みロックの使用法と利点は何ですか?

#1.3 書き込み-書き込み相互排他

書き込みロックを同時に使用する複数のスレッドは、次のコードに示すように、これは書き込み-書き込み相互排他と呼ばれます:

// 创建读写锁
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();

上記のプログラムが実行されます。結果は次のとおりです:

Java 読み取り/書き込みロックの使用法と利点は何ですか?

2. 利点分析

プログラム実行パフォーマンスの向上:詳細 読み取り/書き込みロックを同時に実行できます。どのような状況でも実行のためにキューに入れる必要がある通常のロックとは異なり、読み取り/書き込みロックはプログラムの実行パフォーマンスを向上させます。

Java 読み取り/書き込みロックの使用法と利点は何ですか?

一時データの読み取りを避ける:

読み取りロックと書き込みロックは相互に排他的であり、実行のためにキューに入れられます。これにより、読み取り操作が半分の読み取りと書き込みが行われることがなくなります。一時的なデータ。
  • 3. 該当するシナリオ

    読み取り/書き込みロックは、読み取りが多く書き込みが少ないビジネス シナリオに適しています。現時点では、読み取り/書き込みロックが最大の利点を持っています。 。

以上がJava 読み取り/書き込みロックの使用法と利点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。