JavaTM Platform
Standard Ed. 6

java.util.concurrent.locks
クラス LockSupport

java.lang.Object
  上位を拡張 java.util.concurrent.locks.LockSupport

public class LockSupport
extends Object

ロックおよびほかの同期クラスを作成するための、基本的なスレッドブロックプリミティブです。

このクラスは、それを使用する各スレッドとパーミットを (Semaphore クラスという意味で) 関連付けます。パーミットが利用可能な場合、park の呼び出しはただちに復帰し、プロセス内でパーミットを消費します。パーミットが利用できない場合は、ブロックが可能です。unpark の呼び出しにより、パーミットが利用可能でない場合は利用可能になります。ただし、Semaphore とは異なり、パーミットでは累積は実行されず、最大で 1 つしか存在しません。

park および unpark メソッドは、非推奨メソッド Thread.suspend および Thread.resume を使用不能にするような問題に遭遇しないスレッドをブロックおよびブロック解除する効率的な手段を提供します。park を呼び出すスレッドおよび unpark を試みる別のスレッド間の競合は、パーミットのために活発な状態を維持します。また、呼び出し側のスレッドで割り込みが発生し、かつタイムアウトバージョンがサポートされている場合、park は復帰します。park メソッドは、「理由なしで」いつ復帰することも可能であるため、一般に、復帰時に状態を再チェックするループ内で呼び出す必要があります。この意味で、park はスピンに時間を浪費することを回避する最適化された「ビジーウェイト」として機能しますが、効果を発揮するためには unpark とペアで使用する必要があります。

park の 3 つの形式のそれぞれでも、blocker オブジェクトパラメータをサポートします。スレッドがブロックされるとこのオブジェクトが記録されるため、監視および診断ツールでスレッドがブロックされた理由を特定することができます (このようなツールは、getBlocker(java.lang.Thread) メソッドを使用してブロッカにアクセスできます)。このパラメータを指定しない元の形式ではなくこれらの形式を使用することを強くお勧めします。ロック実装内の blocker として指定される通常の引数は、this です。

これらのメソッドは、高度な同期ユーティリティーの作成用ツールとして使用するように設計されており、それ自体では、たいていの同時制御アプリケーションでは有用ではありません。park メソッドは、次の形式でのみ使用するように設計されています。

while (!canProceed()) { ... LockSupport.park(this); }
canProceed も、park の呼び出し前に行われるその他のアクションも、ロックまたはブロックを伴いません。各スレッドに関連付けられるパーミットは 1 つだけであるため、park を中間的に使用すると、意図した効果と干渉することがあります。

使用例。次に、先入れ先出しで再入不可能なロッククラスの概略を示します。

class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final Queue<Thread> waiters
     = new ConcurrentLinkedQueue<Thread>();

   public void lock() {
     boolean wasInterrupted = false;
     Thread current = Thread.currentThread();
     waiters.add(current);

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() != current ||
            !locked.compareAndSet(false, true)) {
        LockSupport.park(this);
        if (Thread.interrupted()) // ignore interrupts while waiting
          wasInterrupted = true;
     }

     waiters.remove();
     if (wasInterrupted)          // reassert interrupt status on exit
        current.interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   }
 }


メソッドの概要
static Object getBlocker(Thread t)
          まだブロック解除されていない park メソッドの最新の呼び出しに指定されたブロッカオブジェクトを返します。
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)
          指定されたスレッドのパーミットが使用可能でない場合に、使用可能にします。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

メソッドの詳細

unpark

public static void unpark(Thread thread)
指定されたスレッドのパーミットが使用可能でない場合に、使用可能にします。スレッドが park でブロックされた場合に、ブロックを解除します。それ以外の場合、次の park の呼び出しがブロックしないことが保証されます。指定されたスレッドが起動していない場合、この操作の効果は一切保証されません。

パラメータ:
thread - unpark を実行するスレッドまたは nullnull の場合、この操作には何の効果もない

park

public static void park(Object blocker)
パーミットが利用可能でない場合、スレッドのスケジューリングに関して現在のスレッドを無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、復帰時のスレッドの割り込み状態なども判定できます。

パラメータ:
blocker - このスレッドの park を行う同期オブジェクト
導入されたバージョン:
1.6

parkNanos

public static void parkNanos(Object blocker,
                             long nanos)
パーミットが利用可能である場合を除き、現在のスレッドを、指定された待機時間までスレッドスケジューリングに関して無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の経過時間なども判定できます。

パラメータ:
blocker - このスレッドの park を行う同期オブジェクト
nanos - 待機する最大ナノ秒数
導入されたバージョン:
1.6

parkUntil

public static void parkUntil(Object blocker,
                             long deadline)
パーミットが利用可能でない場合、指定された期限まで、スレッドのスケジューリングに関して現在のスレッドを無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の現在時刻なども判定できます。

パラメータ:
blocker - このスレッドの park を行う同期オブジェクト
deadline - 待機用の、エポックからのミリ秒単位の絶対時間
導入されたバージョン:
1.6

getBlocker

public static Object getBlocker(Thread t)
まだブロック解除されていない park メソッドの最新の呼び出しに指定されたブロッカオブジェクトを返します。ブロックされていない場合は null を返します。返される値は、瞬間的なスナップショットです。そのため、スレッドは別のブロッカオブジェクトでブロック解除されていることもブロックされていることもあります。

戻り値:
ブロッカ
導入されたバージョン:
1.6

park

public static void park()
パーミットが利用可能でない場合、スレッドのスケジューリングに関して現在のスレッドを無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、復帰時のスレッドの割り込み状態なども判定できます。


parkNanos

public static void parkNanos(long nanos)
パーミットが利用可能である場合を除き、現在のスレッドを、指定された待機時間までスレッドスケジューリングに関して無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の経過時間なども判定できます。

パラメータ:
nanos - 待機する最大ナノ秒数

parkUntil

public static void parkUntil(long deadline)
パーミットが利用可能でない場合、指定された期限まで、スレッドのスケジューリングに関して現在のスレッドを無効にします。

パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。

このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の現在時刻なども判定できます。

パラメータ:
deadline - 待機用の、エポックからのミリ秒単位の絶対時間

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。