ホームページ  >  記事  >  Java  >  Java言語によるスレッド同期と排他制御の実装方法

Java言語によるスレッド同期と排他制御の実装方法

WBOY
WBOYオリジナル
2023-06-10 09:43:361101ブラウズ

Java 言語は初期にマルチスレッドを導入した言語であり、スレッドを使用することでプログラムの同時処理に威力を発揮します。ただし、スレッド間の同期の問題と相互排他の問題は常にプログラミング プロセスの鍵でした。 Java 言語ではスレッドの同期と相互排他を実装する方法が数多くありますが、この記事ではそのうちのいくつかを紹介します。

1. synchronized キーワードを使用して同期と相互排他を実現する

Synchronized は、Java 言語で同期と相互排他を実現する最も基本的な方法です。 Java では、各オブジェクトにモニターがあり、スレッドがモニターのコード ブロックに入るとオブジェクトのロックを取得し、ロック コード ブロックを実行する必要がある他のスレッドは待機することしかできません。 1 つのスレッドが実行を完了すると、オブジェクトのロックが解放され、オブジェクトを待機している他のスレッドがコード ブロックに入り、上記のプロセスを繰り返すことができます。

synchronized を使用する実装は比較的簡単で、同期する必要があるメソッドまたはコード ブロックの前にキーワード synchronized を追加するだけです。例:

public synchronized void method1(){
  //...
}

またはコード ブロックを使用します:

public void method1(){
  synchronized(this) {
    //...
  }
}

同期の別の形式はクラス ロックです。クラス ロックを使用する場合、モニターは同じクラスの Class オブジェクトになります。例:

public class MyClass {
  public static synchronized void method1(){
    //...
  }
}

上記のコードでは、MyClass のすべてのインスタンスが、MyClass クラスの同じ Class オブジェクトを共有します。

2. ReentrantLock を使用して同期と相互排他を実現する

synchronized キーワードとは異なり、ReentrantLock はキーワードではなくクラスです。 ReentrantLock には synchronized と同様の機能がありますが、同期および相互排他メカニズムのより強力な制御を提供します。対照的に、ReentrantLock の使用はより柔軟であり、たとえば、公平なロックの取得を実現したり、スレッドによるロックの取得数をカウントしたりすることができます。

ReentrantLock の使用法は次のとおりです。

ReentrantLock lock = new ReentrantLock();
lock.lock();
try{
  //...
} finally {
  lock.unlock();
}

ReentrantLock は再入可能です。つまり、同じスレッドがロックを複数回取得できます。

3. CountDownLatch を使用して同期を実現する

CountDownLatch はスレッド同期用のツール クラスで、1 つ以上のスレッドが別のスレッドまたは複数のスレッドの実行が完了するまで待機できるようにします。 CountDownLatch はカウントダウン カウンターを提供します。待機する必要があるスレッドは、Countdown() メソッドを呼び出してカウンターを 1 減分する必要があります。カウンターが 0 の場合、待機中のスレッドは実行を継続できます。

CountDownLatch を使用すると、あるスレッドは続行する前に別のスレッドが開始するのを待つことができます。例:

//初始化计数器为1
CountDownLatch latch = new CountDownLatch(1);

//线程1
new Thread(new Runnable() {
  public void run(){
    //其他操作
    latch.countDown();
  }
}).start();

//线程2等待线程1启动完毕
latch.await();

//线程2继续执行

4. 同期と相互排他を実現するためにセマフォを使用する

セマフォは、特定のリソースに同時にアクセスするスレッドの数を制御できる別の Java 同時実行ツール クラスです。セマフォは一連のライセンスを管理しており、スレッドがライセンスを要求すると、ライセンスを受け取り、実行を継続できます。ライセンスが使い果たされた場合は、続行する前に、他のスレッドがライセンスを返すのを待つ必要があります。

セマフォを使用して、同時にリソースにアクセスするスレッドの数を制限します。例:

//初始化Semaphore,设定同时允许2个线程访问
Semaphore semaphore = new Semaphore(2);

//其他线程请求许可证
semaphore.acquire();

//许可证使用完毕后释放
semaphore.release();

概要:

上記は、スレッドの同期を実現するいくつかの方法です。 Java 言語メソッドの相互排他 (同期は最も基本的な実装メソッドです)、ReentrantLock はより強力な制御メカニズムを提供し、CountDownLatch と Semaphore はスレッド間のコラボレーションと同時実行を適切に制御できます。実際のプログラミングでは、これらのツールを適切に選択し、柔軟に使用することで、Java プログラムにおけるスレッドの同期や相互排他の問題を効果的に回避できます。

以上がJava言語によるスレッド同期と排他制御の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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