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 とペアで使用する必要があります。
これらのメソッドは、高度な同期ユーティリティの作成用ツールとして使用するように設計されており、それ自体では、大抵の同時制御アプリケーションでは有用ではありません。
使用例。以下に、先入れ先出しで再入不可能なロッククラスの概略を示します。
class FIFOMutex {
private AtomicBoolean locked = new AtomicBoolean(false);
private 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();
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 void |
park()
パーミットが利用可能でない場合、スレッドのスケジューリングに関して現在のスレッドを無効にします。 |
static void |
parkNanos(long nanos)
パーミットが利用可能である場合を除き、現在のスレッドを、指定された待機時間までスレッドスケジューリングに関して無効にします。 |
static void |
parkUntil(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 を実行するスレッドまたは null。null の場合、この操作には何の効果もない
park
public static void park()
- パーミットが利用可能でない場合、スレッドのスケジューリングに関して現在のスレッドを無効にします。
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。
- 他のスレッドが、現在のスレッドをターゲットとして unpark を呼び出す
- 別のスレッドが現在のスレッドに
割り込み
を行う - 呼び出しが、見せかけで (理由もなく) 復帰する
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、復帰時のスレッドの割り込み状態なども判定できます。
parkNanos
public static void parkNanos(long nanos)
- パーミットが利用可能である場合を除き、現在のスレッドを、指定された待機時間までスレッドスケジューリングに関して無効にします。
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
- 他のスレッドが、現在のスレッドをターゲットとして unpark を呼び出す
- 別のスレッドが現在のスレッドに
割り込み
を行う - 指定された待機時間が経過する
- 呼び出しが、見せかけで (理由もなく) 復帰する
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の経過時間なども判定できます。
- パラメータ:
nanos
- 待機する最大ナノ秒数
parkUntil
public static void parkUntil(long deadline)
- パーミットが利用可能でない場合、指定された期限まで、スレッドのスケジューリングに関して現在のスレッドを無効にします。
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
- 他のスレッドが、現在のスレッドをターゲットとして unpark を呼び出す
- 別のスレッドが現在のスレッドに
割り込み
を行う - 指定された期限が経過する
- 呼び出しが、見せかけで (理由もなく) 復帰する
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の現在時刻なども判定できます。
- パラメータ:
deadline
- 待機用の、エポックからのミリ秒単位の絶対時間
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。