|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.util.concurrent.locks.LockSupport
public class LockSupport
ロックおよびほかの同期クラスを作成するための、基本的なスレッドブロックプリミティブです。
このクラスは、それを使用する各スレッドとパーミットを (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 |
メソッドの詳細 |
---|
public static void unpark(Thread thread)
park
でブロックされた場合に、ブロックを解除します。それ以外の場合、次の park
の呼び出しがブロックしないことが保証されます。指定されたスレッドが起動していない場合、この操作の効果は一切保証されません。
thread
- unpark を実行するスレッドまたは null
。null
の場合、この操作には何の効果もないpublic static void park(Object blocker)
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、復帰時のスレッドの割り込み状態なども判定できます。
blocker
- このスレッドの park を行う同期オブジェクトpublic static void parkNanos(Object blocker, long nanos)
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
unpark
を呼び出す。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の経過時間なども判定できます。
blocker
- このスレッドの park を行う同期オブジェクトnanos
- 待機する最大ナノ秒数public static void parkUntil(Object blocker, long deadline)
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
unpark
を呼び出す。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の現在時刻なども判定できます。
blocker
- このスレッドの park を行う同期オブジェクトdeadline
- 待機用の、エポックからのミリ秒単位の絶対時間public static Object getBlocker(Thread t)
public static void park()
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 3 つのいずれかが起きるまで待機します。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、復帰時のスレッドの割り込み状態なども判定できます。
public static void parkNanos(long nanos)
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
unpark
を呼び出す。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の経過時間なども判定できます。
nanos
- 待機する最大ナノ秒数public static void parkUntil(long deadline)
パーミットが使用可能な場合、これは消費され、呼び出しはただちに復帰します。それ以外の場合、現在のスレッドは、スレッドスケジューリングに関して無効になり、次の 4 つのいずれかが起きるまで待機します。
unpark
を呼び出す。
このメソッドは、これらのどれがメソッド復帰の原因となったかはレポートしません。呼び出し側は、スレッドの初回 park の原因となった状態を再チェックする必要があります。呼び出し側は、スレッドの割り込み状態や、復帰時の現在時刻なども判定できます。
deadline
- 待機用の、エポックからのミリ秒単位の絶対時間
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。