Java Service Managerスレッド・セーフティ
Java Service Managerは、各JSMクライアント・プログラムに独自のスレッドがあり、各オブジェクト・インスタンスはこのスレッドでのみ有効であるという点でスレッド・セーフです。
共有アクセス権のあるいくつかの内部リソースは、同期ブロック内に収まっています。
トレース順序番号は、JVMのグローバルな共有昇順整数であり、1つのスレッドから、そのスレッドが消去されるまでのうちに1、2回アクセスされます。スレッドに固有の番号を振れば、この共有データに再度アクセスする必要はありません。トレースが無効な場合、スレッドがこの同期リソースにアクセスする必要はありません。
JSMServiceクラスに渡されるすべてのオブジェクトは新しく、現在のスレッドにのみ有効です。
· JSMClient
· JSMTrace
· JSMContainer
· JSMStorage
· JSMResource
· JSMCommand
· JSMField
· JSMFieldList
· JSMList
· JSMResponse
· JSMException
JSMManagerクラスには、IFSからファイルを作成および削除するcreateTemporaryFileとclearTemporaryDirectoryという2つのスタティックなメソッドがあります。
IFSは、同じJVMジョブ内で実行するすべてのスレッドと、マシン上で実行する他のすべてのジョブへの共有リソースです。IFSはこれらのメソッドを同期するために値を追加しません。一時ファイルを作成して消去しようとするスレッドの作成の際に障害となるためです。各スレッドには一時記憶域に使用する一意のIFSサブディレクトリがあるため、リソースの競合は発生しません。
現在のスレッドにのみ有効な場合、サービス・プログラマが新しいスレッドを作成して、この新しいスレッドにオブジェクト参照を渡さない限り、他のスレッドでこれらのオブジェクトに対する読み書きを行うことはできません。
大部分のJSMクラスのインスタンス変数はprivateとfinalであるため、その値を構築後に変更することはできません。すべてのJSMクラスは、同期メソッドを持つオブジェクトを内部的に使用します。
通常、JSMサービス・オブジェクトの状態にアクセスするのは1つのスレッドだけです。これらの同期メソッドはロックおよびアンロック・オーバーヘッドを追加するのみで、他のスレッドの同時発生に影響を与えることはありません。
別のスレッドがオブジェクト参照にアクセスできる場合、これらの同期メソッドでは共有データを保護します。
JSMClientインスタンス変数はprivateおよびfinalで、変更することはできません。このオブジェクトは、読み取り専用で、内部状態は変わらないためスレッド・セーフです。
JSMContainerインスタンス変数はprivateオブジェクトJSMTrace、JSMStorage、JSMResourceです。
JSMStorageオブジェクト参照は変化しません。
JSMTraceとJSMResourceオブジェクト参照は、SERVICE_LOADコマンドを受信すると変化します。
JSMTraceインスタンス変数はprivateであり、変更できません。printメソッドは同期されます。SERVICE_LOADコマンドを受信すると、新しいJSMTraceオブジェクトが作成されます。現在のJSMTraceオブジェクトは閉じるため、使用できなくなります。
JSMStorageインスタンス変数はprivateおよびfinalのHashtableオブジェクトです。オブジェクト参照は変更できませんが、Hashtableコンテンツは同期されたgetおよびputメソッドで修正できます。
JSMResourceインスタンス変数はprivateおよびfinalのHashtableオブジェクトです。オブジェクト参照は変更できませんが、Hashtableコンテンツは同期されたgetおよびputメソッドで修正できます。
JSMFieldインスタンス変数はprivateおよびfinalのStringオブジェクトとDataTypeオブジェクトで、変更することはできません。
DataTypePackedおよびDataTypeZonedインスタンス変数はprivateおよびfinalの整数で、変更することはできません。
DataTypeTextインスタンス変数はprivateおよびfinalのString、整数、バイト配列の各オブジェクトで、変更することはできません。
JSMCommandインスタンス変数はprivateおよびfinalで、変更することはできません。つまり、内部オブジェクト参照は変化しませんが、これらのオブジェクトの内部動作に関するドキュメントをチェックする必要があります。JSMCommandは、他のオブジェクトの集合のフォルダー・オブジェクトにすぎません。
JSMFieldListおよびJSMListオブジェクトはスレッド・セーフではありません。インスタンス変数の内部状態を保護する同期メソッドはありません。複数のスレッドでこれらのオブジェクトのコンテンツを変更する必要がある場合、プログラマが外部的に同期する必要があります。
JSMResponseはスレッド・セーフではありません。インスタンス変数の内部状態を保護する同期メソッドはないため、他の作業スレッドで有効にすることはできません。
JSMExceptionインスタンス変数はprivateであり、構築時に設定されます。変更することはできません。