ホームページ  >  記事  >  Java  >  Java におけるミューテックス セマフォとマルチスレッド待機機構の例

Java におけるミューテックス セマフォとマルチスレッド待機機構の例

黄舟
黄舟オリジナル
2017-09-22 11:54:081912ブラウズ

この記事では、主に Java プログラミングにおけるミューテックス ロック、セマフォ、およびマルチスレッド待機メカニズムの例を紹介します。必要な方は、ミューテックス ロックとセマフォの違いについても簡単に説明します。

ミューテックス ロックとセマフォは、オペレーティング システムでの同時プログラミング用に設計された基本概念です。ミューテックス ロックとセマフォの概念的な違いは、同じリソースに対して、ミューテックス ロックには 0 と 1 の概念しかないことです。そこで止まらないでください。つまり、セマフォを使用すると、複数のスレッドが同時にリソースにアクセスできるようになりますが、同期されたものにアクセスする場合、Java でのミューテックスの実装は ReetranLock です。リソースの場合、そのオブジェクトは tryLock() メソッドを通じてこのロックを取得する必要があります。失敗した場合は false を返し、成功した場合は true を返します。返された情報に基づいて、同期されたリソースにアクセスするかどうかを決定します。以下の例を見てください

public class ReentranLockExample {
 private static int count = 0;
 private static ReentrantLock reentrantLock = new ReentrantLock();
 static class MyThread extends Thread{
  @Override
  public void run() {
   super.run();
   try {
    while (true){
     boolean result = reentrantLock.tryLock();
     if (result){
      System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++);
      reentrantLock.unlock();
     }else{
      System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count);
     }
     System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count);
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  thread1.start();
  thread2.start();
 }
}

セマフォはカウンターに相当します。スレッドがリソースにアクセスしたい場合は、まずこのリソースのセマフォを取得する必要があり、セマフォ内のカウンターは 1 ずつ減分されます。セマフォ内のカウンタが 0 より大きい場合、使用できるリソースがあることを意味し、スレッドがリソースの使用を終了したら、このリソースのセマフォを解放する必要があります。セマフォの機能の 1 つは、特定のリソースにアクセスするためのスレッドを指定することです。初期化するだけで済みます。


Java でのセマフォの実装は

Semaphore

です。これは、同期されたリソースへの最大同時アクセスを指定するために、初期化中に整数で渡されます

public class SemaphoreExample {
 private static Semaphore semaphore = new Semaphore(2);
 private String lock = "lock";
 private static int count = 0;
 static class MyThread extends Thread {
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     semaphore.acquire();
     Thread.sleep(500);
     System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++);
     semaphore.release();
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  MyThread thread3 = new MyThread();
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

CountDownLatch は、出席者が待機するなどの待機メカニズムを実装します。到着してから会議を開始します。 ConutDownLatch は初期化時に待機する数を指定するカウンタです。並行プログラミングでは、すべてのスレッドが特定のポイントに到達するまで待機する必要があります。次のステップを開始するだけです。これは会議に似ています。会議は、参加者全員が到着したときにのみ開始できます

概要

以上がJava におけるミューテックス セマフォとマルチスレッド待機機構の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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