class BooleanLatch {
private static class Sync extends AbstractQueuedSynchronizer {
boolean isSignalled() { return getState() != 0; }
protected int tryAcquireShared(int ignore) {
return isSignalled()? 1 : -1;
}
protected boolean tryReleaseShared(int ignore) {
setState(1);
return true;
}
}
private final Sync sync = new Sync();
public boolean isSignalled() { return sync.isSignalled(); }
public void signal() { sync.releaseShared(1); }
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
}
- 導入されたバージョン:
- 1.5
- 関連項目:
- 直列化された形式
AbstractQueuedSynchronizer
protected AbstractQueuedSynchronizer()
- ゼロの初期同期状態を使用して、新規 AbstractQueuedSynchronizer インスタンスを作成します。
getState
protected final int getState()
- 同期状態の現在値を返します。この操作は、volatile 読み込みのメモリセマンティクスを保持します。
- 戻り値:
- 現在の状態値
setState
protected final void setState(int newState)
- 同期状態の値を設定します。この操作は、volatile 書き込みのメモリセマンティクスを保持します。
- パラメータ:
newState
- 新規状態値
compareAndSetState
protected final boolean compareAndSetState(int expect,
int update)
- 現在の状態値が予想される値に等しい場合、同期状態を指定された更新値に原子的に設定します。この操作は、volatile 読み込みおよび書き込みのメモリセマンティクスを保持します。
- パラメータ:
expect
- 予想される値update
- 新しい値
- 戻り値:
- 成功する場合は true。false は、実際の値が予想される値と等価ではないことを示す
tryAcquire
protected boolean tryAcquire(int arg)
- 排他モードでの取得を試みます。このメソッドは、オブジェクトが排他モードでの取得を許可する状態にあるかどうかを照会し、許可する状態にあれば取得します。
このメソッドは常に取得を実行するスレッドにより呼び出されます。このメソッドが失敗をレポートし、かつスレッドがキューに入れられていない場合、取得メソッドは、他のスレッドからの解放により信号が送信されるまでそのスレッドをキューに入れることができます。これは、Lock.tryLock()
メソッドの実装に使用できます。
デフォルト実装は、UnsupportedOperationException
をスローします。
- パラメータ:
arg
- acquire の引数。この値は、常に acquire メソッドに渡される値、または状態待機へのエントリで保存される値になる。それ以外の場合、この値は未解釈となり、任意の値を表すことができる
- 戻り値:
- 成功する場合は true。成功時には、このオブジェクトは取得済みである
- 例外:
IllegalMonitorStateException
- 取得により、このシンクロナイザが不正な状態に置かれる場合。同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある
UnsupportedOperationException
- 排他モードがサポートされていない場合
tryRelease
protected boolean tryRelease(int arg)
- 排他モードでの解放を反映するように、状態の設定を試みます。
このメソッドは、解放を実行するスレッドにより常に呼び出されます。
デフォルト実装は、UnsupportedOperationException
をスローします。
- パラメータ:
arg
- release の引数。この値は、常に release メソッドに渡される値、または状態待機へのエントリでの現在の状態値になる。それ以外の場合、この値は未解釈となり、任意の値を表すことができる
- 戻り値:
- 待機中の任意のスレッドが取得を試みることができるように、このオブジェクトが完全に解放された状態にある場合は true、そうでない場合は false
- 例外:
IllegalMonitorStateException
- 解放により、このシンクロナイザが不正な状態に置かれる場合。同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある
UnsupportedOperationException
- 排他モードがサポートされていない場合
tryAcquireShared
protected int tryAcquireShared(int arg)
- 共有モードでの取得を試みます。このメソッドは、オブジェクトが共有モードでの取得を許可する状態にあるかどうかを照会し、許可する状態にあれば取得します。
このメソッドは常に取得を実行するスレッドにより呼び出されます。このメソッドが失敗をレポートし、かつスレッドがキューに入れられていない場合、取得メソッドは、他のスレッドからの解放により信号が送信されるまでそのスレッドをキューに入れることができます。
デフォルト実装は、UnsupportedOperationException
をスローします。
- パラメータ:
arg
- acquire の引数。この値は、常に acquire メソッドに渡される値、または状態待機へのエントリで保存される値になる。それ以外の場合、この値は未解釈となり、任意の値を表すことができる
- 戻り値:
- 失敗した場合は負の値、排他的に成功した場合はゼロ、非排他的に成功した場合は正の値。どの場合でも、後続の待機スレッドは可用性をチェックする必要がある (3 つの異なる戻り値のサポートにより、取得だけが時折排他的に動作するコンテキスト内でこのメソッドを使用することが可能になる)。成功時には、このオブジェクトは取得済みである
- 例外:
IllegalMonitorStateException
- 取得により、このシンクロナイザが不正な状態に置かれる場合。同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある
UnsupportedOperationException
- 共有モードがサポートされていない場合
tryReleaseShared
protected boolean tryReleaseShared(int arg)
- 共有モードでの解放を反映するように、状態の設定を試みます。
このメソッドは、解放を実行するスレッドにより常に呼び出されます。
デフォルト実装は、UnsupportedOperationException
をスローします。
- パラメータ:
arg
- release の引数。この値は、常に release メソッドに渡される値、または状態待機へのエントリでの現在の状態値になる。それ以外の場合、この値は未解釈となり、任意の値を表すことができる
- 戻り値:
- 待機中の任意のスレッドが取得を試みることができるように、このオブジェクトが完全に解放された状態にある場合は true、そうでない場合は false
- 例外:
IllegalMonitorStateException
- 解放により、このシンクロナイザが不正な状態に置かれる場合。同期が正しく機能するためには、この例外を一貫した方式でスローする必要がある
UnsupportedOperationException
- 共有モードがサポートされていない場合
isHeldExclusively
protected boolean isHeldExclusively()
- 現在の (呼び出し側の) スレッドに関して、同期が排他的に行われる場合は true を返します。非待機状態の
AbstractQueuedSynchronizer.ConditionObject
メソッドが呼び出されるごとに、このメソッドが呼び出されます (待機状態のメソッドでは release(int)
が呼び出される)。
デフォルト実装は、UnsupportedOperationException
をスローします。このメソッドは、AbstractQueuedSynchronizer.ConditionObject
メソッドで内部的にのみ呼び出されるため、状態が使用されない場合は定義する必要がありません。
- 戻り値:
- 同期が排他的に行われる場合は true、そうでない場合は false
- 例外:
UnsupportedOperationException
- 状態がサポートされない場合
acquire
public final void acquire(int arg)
- 割り込みを無視して、排他モードで取得します。一度以上
tryAcquire(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するまで tryAcquire(int)
を呼び出します。このメソッドは、Lock.lock()
メソッドの実装に使用できます。
- パラメータ:
arg
- acquire の引数。この値は tryAcquire(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
acquireInterruptibly
public final void acquireInterruptibly(int arg)
throws InterruptedException
- 排他モードで取得します。割り込みが発生した場合は、中止します。最初に割り込み状態をチェックしてから一度以上
tryAcquire(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割り込みが発生するまで tryAcquire(int)
を呼び出します。このメソッドは、Lock.lockInterruptibly()
メソッドの実装に使用できます。
- パラメータ:
arg
- acquire の引数。この値は tryAcquire(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
- 例外:
InterruptedException
- 現在のスレッドで割り込みが発生した場合
tryAcquireNanos
public final boolean tryAcquireNanos(int arg,
long nanosTimeout)
throws InterruptedException
- 排他モードで取得を試みます。割り込みが発生した場合は中止し、指定されたタイムアウト時間が経過した場合は失敗します。最初に割り込み状態をチェックしてから一度以上
tryAcquire(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割り込みが発生するか、タイムアウト時間が経過するまで tryAcquire(int)
を呼び出します。このメソッドは、Lock.tryLock(long, TimeUnit)
メソッドの実装に使用できます。
- パラメータ:
arg
- acquire の引数。この値は tryAcquire(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができるnanosTimeout
- 待機する最大ナノ秒数
- 戻り値:
- 取得した場合は true、タイムアウトした場合は false
- 例外:
InterruptedException
- 現在のスレッドで割り込みが発生した場合
release
public final boolean release(int arg)
- 排他モードで解放します。
tryRelease(int)
が true を返す場合、1 つ以上のスレッドをブロック解除することで実装されます。このメソッドは、Lock.unlock()
メソッドの実装で使用できます。
- パラメータ:
arg
- release の引数。この値は tryRelease(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
- 戻り値:
tryRelease(int)
から返される値
acquireShared
public final void acquireShared(int arg)
- 割り込みを無視して、共有モードで取得します。最初に一度以上
tryAcquireShared(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するまで tryAcquireShared(int)
を呼び出します。
- パラメータ:
arg
- acquire の引数。この値は tryAcquireShared(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
acquireSharedInterruptibly
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException
- 共有モードで取得します。割り込みが発生した場合には中止します。最初に割り込み状態をチェックしてから、一度以上
tryAcquireShared(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するかスレッドで割り込みが発生するまで tryAcquireShared(int)
を呼び出します。
- パラメータ:
arg
- acquire の引数。この値は tryAcquireShared(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
- 例外:
InterruptedException
- 現在のスレッドで割り込みが発生した場合
tryAcquireSharedNanos
public final boolean tryAcquireSharedNanos(int arg,
long nanosTimeout)
throws InterruptedException
- 共有モードで取得を試みます。割り込みが発生した場合は中止し、指定されたタイムアウト時間が経過した場合は失敗します。最初に割り込み状態をチェックしてから、一度以上
tryAcquireShared(int)
を呼び出すことで実装され、成功時に復帰します。それ以外の場合、スレッドはキューに入れられ、大抵の場合ブロックおよびブロック解除を何度も繰り返し、成功するか、スレッドで割り込みが発生するか、タイムアウト時間が経過するまで tryAcquireShared(int)
を呼び出します。
- パラメータ:
arg
- acquire の引数。この値は tryAcquireShared(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができるnanosTimeout
- 待機する最大ナノ秒数
- 戻り値:
- 取得した場合は true、タイムアウトした場合は false
- 例外:
InterruptedException
- 現在のスレッドで割り込みが発生した場合
releaseShared
public final boolean releaseShared(int arg)
- 共有モードで解放します。
tryReleaseShared(int)
が true を返す場合、1 つ以上のスレッドをブロック解除することで実装されます。
- パラメータ:
arg
- release の引数。この値は tryReleaseShared(int)
に送信されるが、それ以外の場合は未解釈となり、任意の値を表すことができる
- 戻り値:
tryReleaseShared(int)
から返される値
hasQueuedThreads
public final boolean hasQueuedThreads()
- 取得を待機中のスレッドが存在するかどうかを照会します。いずれかの時点で割り込みおよびタイムアウトによる取り消しが発生した場合、true が返されても他のスレッドが取得を実行することは保証されません。
この実装では、この操作は一定の時間で復帰します。
- 戻り値:
- ロックの取得を待機中の他のスレッドが存在する可能性がある場合は true
hasContended
public final boolean hasContended()
- このシンクロナイザの取得で競合しているスレッドが存在するかどうか (つまり、acquire メソッドがブロックされたかどうか) を照会します。
この実装では、この操作は一定の時間で復帰します。
- 戻り値:
- 競合が存在する場合は true
getFirstQueuedThread
public final Thread getFirstQueuedThread()
- キュー内の最初の (待機時間のもっとも長い) スレッドを返します。現在キューに入れられているスレッドが存在しない場合は null を返します。
通常、この実装では、この操作は一定時間で復帰します。ただし、他のスレッドがキューの変更を同時に実行している場合は、競合により処理を繰り返す場合があります。
- 戻り値:
- キュー内の最初の (待機時間のもっとも長い) スレッド。現在キューに入れられているスレッドが存在しない場合は null
isQueued
public final boolean isQueued(Thread thread)
- 指定されたスレッドが、現在、キューに入れられている場合は true を返します。
この実装は、キューをトラバースして指定されたスレッドの存在を判別します。
- パラメータ:
thread
- スレッド
- 戻り値:
- 指定されたスレッドがキューに存在する場合は true
- 例外:
NullPointerException
- スレッドが null の場合
getQueueLength
public final int getQueueLength()
- 取得を待機しているスレッドの推定数を返します。このメソッドが内部のデータ構造をトラバースしている間にも、スレッド数が動的に変化する場合があるため、この値は推定に過ぎません。このメソッドは、同期の制御用ではなく、システム状態を監視するためのものです。
- 戻り値:
- このロックを待機しているスレッドの推定数
getQueuedThreads
public final Collection<Thread> getQueuedThreads()
- 取得を待機しているスレッドを含むコレクションを返します。実際のスレッドセットは、結果の構築中にも動的に変化する可能性があるため、返されるコレクションは最善の努力を払った上での推定に過ぎません。返されるコレクションの要素には、特定の順序は存在しません。このメソッドは、より包括的な監視機能を提供するサブクラスの構築を容易にする目的で設計されています。
- 戻り値:
- スレッドのコレクション
getExclusiveQueuedThreads
public final Collection<Thread> getExclusiveQueuedThreads()
- 排他モードで取得するために待機中のスレッドを含むコレクションを返します。これは、排他的取得のために待機中のスレッドのみを返すことを除いては、
getQueuedThreads()
と同じプロパティを保持します。
- 戻り値:
- スレッドのコレクション
getSharedQueuedThreads
public final Collection<Thread> getSharedQueuedThreads()
- 共有モードで取得するために待機中のスレッドを含むコレクションを返します。これは、共有的取得のために待機中のスレッドのみを返すことを除き、
getQueuedThreads()
と同じプロパティを保持します。
- 戻り値:
- スレッドのコレクション
toString
public String toString()
- シンクロナイザおよびその状態を識別する文字列を返します。状態は括弧で囲まれ、文字列「State =」に続いて
getState()
の現在値、およびキューが空かどうかに応じて「nonempty」または「empty」が含まれます。
- オーバーライド:
- クラス
Object
内の toString
- 戻り値:
- このシンクロナイザおよびその状態を識別する文字列
owns
public final boolean owns(AbstractQueuedSynchronizer.ConditionObject condition)
- 指定された ConditionObject がこのシンクロナイザをロックとして使用するかどうかを照会します。
- パラメータ:
condition
- 状態
- 戻り値:
- 所有される場合は true
- 例外:
NullPointerException
- 状態が null の場合
hasWaiters
public final boolean hasWaiters(AbstractQueuedSynchronizer.ConditionObject condition)
- このシンクロナイザに関連付けられた指定状態で待機しているスレッドが存在するかどうかを照会します。タイムアウトおよび割り込みの発生する可能性はいつでも存在するため、true は、将来の signal がスレッドを起動させることを保証しません。このメソッドは、主にシステム状態の監視に使用するためのものです。
- パラメータ:
condition
- 状態
- 戻り値:
- 待機中のスレッドが存在する場合は true
- 例外:
IllegalMonitorStateException
- 排他的同期が保持されない場合
IllegalArgumentException
- 指定された状態がこのシンクロナイザと関連付けられていない場合
NullPointerException
- 状態が null の場合
getWaitQueueLength
public final int getWaitQueueLength(AbstractQueuedSynchronizer.ConditionObject condition)
- このシンクロナイザに関連付けられた指定状態で待機しているスレッドの推定数を返します。タイムアウトおよび割り込みの発生する可能性はいつでも存在するため、推定数は、実際の待機者数に関する上限を示すに過ぎません。このメソッドは、同期の制御用としてではなく、システム状態の監視用として設計されています。
- パラメータ:
condition
- 状態
- 戻り値:
- 待機中のスレッドの推定数
- 例外:
IllegalMonitorStateException
- 排他的同期が保持されない場合
IllegalArgumentException
- 指定された状態がこのシンクロナイザと関連付けられていない場合
NullPointerException
- 状態が null の場合
getWaitingThreads
public final Collection<Thread> getWaitingThreads(AbstractQueuedSynchronizer.ConditionObject condition)
- このシンクロナイザに関連付けられた指定状態で待機中のスレッドを含むコレクションを返します。実際のスレッドセットは、結果の構築中に動的に変化する可能性があるため、返されるコレクションは最善の努力を払った上での推定に過ぎません。返されるコレクションの要素には、特定の順序は存在しません。
- パラメータ:
condition
- 状態
- 戻り値:
- スレッドのコレクション
- 例外:
IllegalMonitorStateException
- 排他的同期が保持されない場合
IllegalArgumentException
- 指定された状態がこのシンクロナイザと関連付けられていない場合
NullPointerException
- 状態が null の場合
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。