パッケージ | flash.concurrent |
クラス | public final class Mutex |
継承 | Mutex Object |
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11.5, AIR 3.5 |
shareable
プロパティが true
である ByteArray オブジェクト)にアクセスする複数のワーカーでコードを管理することです。一方、Mutex は、AIR ネイティブ拡張やファイルシステムのファイルなど、任意の共有可能リソースに対するワーカーのアクセスを管理するためにも使用できます。リソースが何であれ、mutex の目的は、一度に 1 つのコードセットのみがリソースにアクセスするようにすることにあります。
mutex は、リソースの所有権という概念を使用してアクセスを管理します。どの時点でも、1 つの mutex が最大 1 つのワーカーによって「所有」されます。あるワーカーから別のワーカーに mutex の所有権を切り替えるとき、その移行はアトミックです。そのため、複数のワーカーが 1 つの mutex の所有権を取得することは不可能であることが保証されます。ワーカーが mutex を所有しているときしかワーカー内のコードで共有リソースに対する処理を実行できない以上、複数のワーカーによる競合が発生しないことは明らかです。
取得できる場合に mutex の所有権を取得するには、tryLock()
メソッドを使用します。mutex を取得できるようになるまで現在のワーカーの実行を一時停止し、その後 mutex の所有権を取得するには、lock()
メソッドを使用します。現在のワーカーが mutex の所有権を取得した後は、共有リソースに対して安全に処理を実行できます。これらの処理が完了したときに、unlock()
メソッドを呼び出して mutex を解放します。その時点で、現在のワーカーは共有リソースにアクセスできなくなります。
Mutex クラスは特別なオブジェクトタイプの 1 つで、ワーカー間でコピーされるのではなく、共有されます。Worker オブジェクトの setSharedProperty()
メソッドを呼び出すか、または MessageChannel オブジェクトを使用して、あるワーカーから別のワーカーに mutex を渡す場合、両方のワーカーは、ランタイムのメモリの同じ Mutex オブジェクトを参照します。
関連する API エレメント
メソッド | 定義元 | ||
---|---|---|---|
Mutex()
新しい Mutex インスタンスを作成します。 | Mutex | ||
オブジェクトに指定されたプロパティが定義されているかどうかを示します。 | Object | ||
Object クラスのインスタンスが、パラメーターとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。 | Object | ||
この mutex を取得できるようになるまで現在のワーカーの実行を一時停止し、その後 mutex の所有権を取得します。 | Mutex | ||
指定されたプロパティが存在し、列挙できるかどうかを示します。 | Object | ||
ループ処理に対するダイナミックプロパティの可用性を設定します。 | Object | ||
ロケール固有の規則に従って書式設定された、このオブジェクトのストリング表現を返します。 | Object | ||
指定されたオブジェクトのストリング表現を返します。 | Object | ||
取得できる場合に mutex の所有権を取得します。 | Mutex | ||
この mutex の所有権を解放します。その結果、他のワーカーがこの mutex を取得し、関連するリソースに対する処理を実行できるようになります。 | Mutex | ||
指定されたオブジェクトのプリミティブな値を返します。 | Object |
Mutex | () | コンストラクター |
public function Mutex()
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11.5, AIR 3.5 |
新しい Mutex インスタンスを作成します。
例外
Error — mutex を初期化できなかった場合。
|
lock | () | メソッド |
public function lock():void
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11.5, AIR 3.5 |
この mutex を取得できるようになるまで現在のワーカーの実行を一時停止し、その後 mutex の所有権を取得します。lock()
を呼び出したときに別のワーカーが mutex を所有している場合は、呼び出し元のワーカーの実行スレッドは lock()
の呼び出し箇所で一時停止し、所有権要求のキューに追加されます。呼び出し元のワーカーが mutex を取得した後、lock()
呼び出しの次のコード行より、ワーカーの実行が再開されます。
現在のワーカーが mutex の所有権を取得した後は、共有リソースに対して安全に処理を実行できます。これらの処理が完了したときに、unlock()
メソッドを呼び出して mutex を解放します。その時点で、現在のワーカーは共有リソースにアクセスできなくなります。
mutex では、受け取ったロック要求数を内部的に保持しています。完全に解放される前に、mutex は同じ数のロック解除要求を受け取る必要があります。mutex を所有しているワーカーのコードで(lock()
メソッドを呼び出して)再度その mutex をロックすると、内部的なロック数が 1 増加します。mutex の所有権を解放するために、ロック要求と同じ数だけ unlock()
メソッドを呼び出す必要があります。
1 つの mutex に対して複数のワーカーが待機している場合、その mutex では最も長く待機しているワーカーに優先的に所有権が割り当てられます。ただし、ワーカースレッドのスケジュールはホストオペレーティングシステムによって管理されるので、複数のワーカーにおいて特定の順序でコードが実行される保証はありません。
tryLock | () | メソッド |
public function tryLock():Boolean
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11.5, AIR 3.5 |
取得できる場合に mutex の所有権を取得します。別のワーカーが既に mutex を所有している場合、または別のワーカーが lock()
メソッドを呼び出しており mutex の取得を待機中の場合は、mutex を取得することはできません。そのような場合は、このメソッドを呼び出すと false
が返され、コードの実行は即座に再開されます。
現在のワーカーが mutex の所有権を取得した後は、共有リソースに対して安全に処理を実行できます。これらの処理が完了したときに、unlock()
メソッドを呼び出して mutex を解放します。その時点で、現在のワーカーは共有リソースにアクセスできなくなります。
1 つの mutex に対して複数のワーカーが待機している場合、その mutex では最も長く待機しているワーカーに優先的に所有権が割り当てられます。ただし、ワーカースレッドのスケジュールはホストオペレーティングシステムによって管理されるので、複数のワーカーにおいて特定の順序でコードが実行される保証はありません。
戻り値Boolean — mutex を取得できた場合は true (この場合、現在のワーカーがその mutex を所有するようになる)、現在のワーカーが mutex の所有権を取得できなかった場合は false です。
|
unlock | () | メソッド |
public function unlock():void
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11.5, AIR 3.5 |
この mutex の所有権を解放します。その結果、他のワーカーがこの mutex を取得し、関連するリソースに対する処理を実行できるようになります。
mutex では、受け取ったロック要求数を内部的に保持しています。ワーカーのコードでは、mutex の所有権を解放するために、ロック要求と同じ数だけ unlock()
メソッドを呼び出す必要があります。
例外
IllegalOperationError — 現在のワーカーがこの mutex を所有していない場合。
|
Tue Jun 12 2018, 10:34 AM Z