javaにおける相互反発ロック信号量とマルチスレッド待ち機構を詳細に説明する。


相互反発ロックと信号量はすべてオペレーティングシステムにおける同時プログラミング設計の基本概念であり、相互反発ロックと信号量の概念の違いは、同じリソースに対して、相互反発ロックは0と1の概念だけであり、信号量はこれに限らない。つまり、信号量はリソースを同時に複数のスレッドにアクセスさせることができ、互いに反発しながら一つのスレッドにしかアクセスできない。
javaにおける相互反発ロックの実現は、Reetrance Lockであり、同期リソースにアクセスする際には、そのオブジェクトは方法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より大きい場合は使用可能なリソースがあり、スレッドがリソースを使用し終わったら、このリソースの信号量を解放しなければならない。信号量の一つの役割は、指定されたスレッドが同僚にあるリソースを訪問することを実現することです。初期化だけが必要です。
信号量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は、参加者が到着するのを待って会議を開始するなどの待ち機構を実現する。ContutDownLatchは初期化中のカウンタの一つで、待つべき個数を指定します。同時プログラミングでは、解決された需要は、スレッドがある時点に到達するのを待つことです。やっと次のステップが始まりました。会議に似ています。全員がそろったら、会議が始まります。

public class CountDownLatchExample {
 private static CountDownLatch mCountDownLatch = new CountDownLatch(3);
 static class MyThread extends Thread {
  int awaitTime;
  public MyThread(int i) {
   this.awaitTime = i;
  }
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     Thread.sleep(awaitTime);
     System.out.println(Thread.currentThread().getName() + "arrived " );
     mCountDownLatch.countDown();
     mCountDownLatch.await(); //        
     System.out.println(Thread.currentThread().getName() + "start meeting " );
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread(500);
  MyThread thread2 = new MyThread(1000);
  MyThread thread3 = new MyThread(2000);
  thread1.start();
  thread2.start();
  thread3.start();
 }
}
締め括りをつける
以上が、Javaプログラミングにおける相互反発ロック、信号量及びマルチスレッド待ち機構の実例に関する詳細な内容のすべてです。
興味のある友達はJavaマルチスレッドのチケット販売例Javaマルチスレッド同時プログラミング(相互反発ロックRentrant Lock)などを知ることができます。