Java concurrencyのLockSupport_動力ノードJava学院の整理


LockSupport紹介
ロックSupportは、ロックや他の同期類を作成するための基本的なスレッドブロッキング原語です。
LockSupportのpark()とunpark()の役割はそれぞれブロックスレッドとブロック解除スレッドであり、park()とunpark()は「Thread.suspendとThread.reumeによるデッドロック」の問題に遭遇しない。
park()とunpark()が許可されているからです。park()を呼び出したスレッドと他のスレッドとの間の競合は活性化されます。
LockSupport関数一覧

//                  park       blocker   ,         ,    null。
static Object getBlocker(Thread t)
//       ,      ,      。
static void park()
//       ,             。
static void park(Object blocker)
//             ,           ,      。
static void parkNanos(long nanos)
//       ,            ,            。
static void parkNanos(Object blocker, long nanos)
//       ,             ,      。
static void parkUntil(long deadline)
//       ,             ,      。
static void parkUntil(Object blocker, long deadline)
//              ,     。
static void unpark(Thread thread)
LockSupportの例
以下の「例1」と「例2」を比較して、LockSupportの使い方をより明確に知ることができます。
例1

public class WaitTest1 {

  public static void main(String[] args) {

    ThreadA ta = new ThreadA("ta");

    synchronized(ta) { //   synchronized(ta)  “  ta    ”
      try {
        System.out.println(Thread.currentThread().getName()+" start ta");
        ta.start();

        System.out.println(Thread.currentThread().getName()+" block");
        //      
        ta.wait();

        System.out.println(Thread.currentThread().getName()+" continue");
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  static class ThreadA extends Thread{

    public ThreadA(String name) {
      super(name);
    }

    public void run() {
      synchronized (this) { //   synchronized(this)  “        ”
        System.out.println(Thread.currentThread().getName()+" wakup others");
        notify();  //   “          ”
      }
    }
  }
}
例2

import java.util.concurrent.locks.LockSupport;

public class LockSupportTest1 {

  private static Thread mainThread;

  public static void main(String[] args) {

    ThreadA ta = new ThreadA("ta");
    //      
    mainThread = Thread.currentThread();

    System.out.println(Thread.currentThread().getName()+" start ta");
    ta.start();

    System.out.println(Thread.currentThread().getName()+" block");
    //      
    LockSupport.park(mainThread);

    System.out.println(Thread.currentThread().getName()+" continue");
  }

  static class ThreadA extends Thread{

    public ThreadA(String name) {
      super(name);
    }

    public void run() {
      System.out.println(Thread.currentThread().getName()+" wakup others");
      //   “   ”
      LockSupport.unpark(mainThread);
    }
  }
}
実行結果:
main start ta
main block
ta wakup others
main contine
説明:parkとwaitの違い。waitがスレッドをブロックする前に、synchronizedで同期ロックを取得しなければなりません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。