ホームページ  >  記事  >  Java  >  Java の同時プログラミングでは読み取り/書き込みロックはどのように使用されますか?

Java の同時プログラミングでは読み取り/書き込みロックはどのように使用されますか?

PHPz
PHPzオリジナル
2024-05-01 17:12:011149ブラウズ

読み取り/書き込みロックは、複数のスレッドが共有リソースを同時に読み取ることを可能にする同時実行制御メカニズムですが、一度に書き込むことができるスレッドは 1 つだけです。これは主に、読み取り集中型のワークロードと散発的な書き込みを行うアプリケーションに使用されます。 Java では、java.util.concurrent.locks.ReadWriteLock インターフェースを使用して読み取り/書き込みロックを実装できます。読み取りロックは読み取りアクセスを許可し、書き込みロックは書き込みアクセスを許可します。たとえば、共有カウンタでは、複数のスレッドがカウンタ値を同時に読み取ることができ、書き込みスレッドはカウンタを更新するために書き込みロックを取得する必要があるため、書き込みのアトミック性とデータの整合性が確保されます。

Java 中的读写锁如何用于并发编程?

Java の読み書きロックは同時プログラミングに使用されます

はじめに

読み書きロックは、複数のスレッドが共有リソースを同時に読み取ることを可能にする同時実行制御メカニズムですが、一度に書き込むことができるのは 1 つのスレッドだけです時間 共有リソースを入力します。これは、読み取り中心のワークロードと時折の書き込みを行うアプリケーションに役立ちます。

ミューテックス ロックとは異なり、読み取り/書き込みロックでは、複数のリーダーが共有リソースに同時にアクセスできる一方、ライターはリソースに排他的にアクセスできます。

Java での読み取り/書き込みロックの使用

Java の java.util.concurrent.locks.ReadWriteLock インターフェースは、読み取り/書き込みロックの機能を提供します。これには 2 種類のロックがあります:

  • 読み取りロック: スレッドが共有リソースへの読み取りアクセスを取得できるようにします。
  • 書き込みロック: スレッドが共有リソースへの書き込みアクセスを取得できるようにします。

読み取り/書き込みロックの使用例を次に示します。

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedResource {

    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private int value;

    public void read() {
        lock.readLock().lock();
        try {
            // 读取共享资源
            System.out.println("Reading: " + value);
        } finally {
            lock.readLock().unlock();
        }
    }

    public void write(int newValue) {
        lock.writeLock().lock();
        try {
            // 写入共享资源
            value = newValue;
            System.out.println("Writing: " + value);
        } finally {
            lock.writeLock().unlock();
        }
    }
}

実際的なケース

複数のスレッドがカウンター値を読み取り、1 つのスレッドだけがカウンター値を更新する共有カウンターを考えてみましょう。読み取り/書き込みロックを使用して、同時アクセス中のデータの整合性を確保できます。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CounterExample {

    private final SharedResource counter = new SharedResource();
    private final ExecutorService executor = Executors.newFixedThreadPool(10);

    public void run() {
        // 创建 10 个读取线程
        for (int i = 0; i < 10; i++) {
            executor.submit(counter::read);
        }

        // 模拟写入线程
        for (int i = 0; i < 100; i++) {
            executor.submit(() -> counter.write(i));
        }

        executor.shutdown();
    }

    public static void main(String[] args) {
        new CounterExample().run();
    }
}

この例では、複数の読み取りスレッドがカウンター値を同時に読み取ることができ、書き込みスレッドはカウンターにアクセスする前に書き込みロックを取得します。これにより、書き込み操作のアトミック性とデータの整合性が保証されます。

以上がJava の同時プログラミングでは読み取り/書き込みロックはどのように使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。