ホームページ  >  記事  >  Java  >  Java 同時実行における再入ロックと読み取り/書き込みロックの詳細な説明

Java 同時実行における再入ロックと読み取り/書き込みロックの詳細な説明

黄舟
黄舟オリジナル
2017-09-26 09:50:061646ブラウズ

この記事では、Java 同時プログラミングにおける再入ロックと読み取り/書き込みロックについて詳しく説明しており、必要な方は詳細を学ぶことができます。

再入ロック

再入ロックは、名前が示すように、再入をサポートするロックであり、スレッドによるリソースの繰り返しロックをサポートできることを意味します。リエントリーとは、ロックを取得した後に、どのスレッドもロックにブロックされることなく再度ロックを取得できることを意味します。この機能を実装するには、次の 2 つの問題を解決する必要があります。

1. スレッドが再度ロックを取得します。ロックは、ロックを取得しているスレッドが現在ロックを占有しているスレッドであるかどうかを識別する必要があります。そうであれば、再度正常にロックを取得できます。

2. ロックの最終的な解除。スレッドはロックを n 回繰り返し取得し、n 回目にロックを解放すると、他のスレッドがロックを取得できるようになります。ロックを最終的に解放するには、ロックが取得のカウントを増加する必要があります。カウントは、現在のロックが繰り返し取得された回数を表します。カウントが 0 になると、それは減少します。ロックは正常に解除されました。

Java の組み込みロック (同期) とロック (ReentrantLock) は両方とも再入可能です

同期インスタンス


package com.home;
public class SynchronizedTest implements Runnable {
  public synchronized void method1() {
    System.out.println("method1获得锁,正常运行!");
    method2();
  }
  public synchronized void method2() {
    System.out.println("method2获得锁,也正常运行!");
  }
  @Override
  public void run() {
    method1();
  }
  public static void main(String[] args) {
    SynchronizedTest st = new SynchronizedTest();
    new Thread(st).start();
    new Thread(st).start();
  }
}

ロック インスタンス


package com.home;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest implements Runnable {
  Lock lock = new ReentrantLock();
  public void method1() {
    lock.lock();
    System.out.println("method1获得锁,正常运行!");
    method2();
    lock.unlock();
  }
  public void method2() {
    lock.lock();
    System.out.println("method2获得锁,也正常运行!");
    lock.unlock();
  }
  @Override
  public void run() {
    method1();
  }
  public static void main(String[] args) {
    LockTest lt = new LockTest();
    new Thread(lt).start();
    new Thread(lt).start();
  }
}

例の最終結果すべて正しく、結果は次のとおりです。


method1获得锁,正常运行!
method2获得锁,也正常运行!
method1获得锁,正常运行!
method2获得锁,也正常运行!

リエントラント ロックの最大の役割は、デッドロックを回避することです

読み取り/書き込みロック

読み取り/書き込みロックは、関連するロックのペアを維持します。 1 つは読み取り操作専用、もう 1 つは書き込み操作専用です。ライターが存在しない限り、読み取りロックは複数のリーダー スレッドによって同時に保持される可能性があります。書き込みロックは排他的です。

Reentrant ReadWriteLock

ReentrantReadWriteLock オブジェクトは、読み取りロックと書き込みロックを取得するための readLock() メソッドと writeLock() メソッドを提供します。

読み取りロックは複数のリーダー スレッドを同時に保持し、書き込みを許可します。ロックは最大 1 つの書き込みスレッドによってのみ保持できます。

読み取り/書き込みロックの使用状況: 共有データの読み取り頻度が共有データの変更頻度よりもはるかに高い場合は、読み取り/書き込みロックを使用します。共有リソースへのアクセスを制御し、同時実行パフォーマンスを向上させることができます。

スレッドがすでに書き込みロックを保持している場合は、読み取り/書き込みロックを保持できます。読み取りロックが解放されると、書き込みロックは保持できなくなります。

書き込みロックにバインドされている Condition オブジェクトを取得するには、書き込みロックの newCondition() メソッドを呼び出します。通常のミューテックス ロックとの違いは何ですか。ただし、読み取りロックの newCondition() メソッドを呼び出すと例外がスローされます。複数のスレッドが同時に読み取ることができますが、書き込みできるのは 1 つのスレッドのみです。つまり、データの書き込みとデータの書き込みは同時に完了します。

概要


以上がJava 同時実行における再入ロックと読み取り/書き込みロックの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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