(57)【特許請求の範囲】
【請求項１】
オブジェクトに関連付けられた特定同期コンストラクトを参照するレファレンスデータを求めるために、スレッド固有に割り当てられたスレッド−ローカルキャッシュの一部であるローカルデータ構造を検索するステップと、
前記ローカルデータ構造が前記特定同期コンストラクトを参照する前記レファレンスデータを含まない場合、オブジェクトを同期コンストラクトに関連付けるデータを含み、全てのスレッドにより使用されるグローバルデータ構造を使用して、前記特定同期コンストラクトを検索するステップと、
前記特定同期コンストラクトを使用して、前記オブジェクトを前記スレッドに同期させるステップと、
を含んで構成されるオブジェクトをスレッドに同期させる方法。
【請求項２】
前記ローカルデータ構造を検索する際に、前記オブジェクトを識別するイン−プログレスレファレンスを設定するステップを更に含む請求項１記載のオブジェクトをスレッドに同期させる方法。
【請求項３】
前記イン−プログレスレファレンスが設定された時に、前記オブジェクトと前記特定同期コンストラクトとの間の関連付けの終了を防止するステップを更に含む請求項２記載のオブジェクトをスレッドに同期させる方法。
【請求項４】
特定オブジェクトと前記特定オブジェクトに関連付けられた特定同期コンストラクトとの関連付けを終了するステップと、
特定オブジェクトの関連付けの終了に応答して、いずれの同期コンストラクトも参照しないように前記レファレンスデータを設定するステップと、
を更に含む請求項１記載のオブジェクトをスレッドに同期させる方法。
【請求項５】
ターミネーション可能状態が検出された時に、前記特定オブジェクトと前記特定オブジェクトに関連付けられた特定同期コンストラクトとの関連付けを終了するステップが最後に実行されてから、前記ローカルデータ構造が修正されたか否かを判定するステップと、
前記ローカルデータ構造が修正された場合、いずれの同期コンストラクタも参照しないように前記ローカルデータ構造のレファレンスデータを設定するステップと、
を更に含む請求項１記載のオブジェクトをスレッドに同期させる方法。
【請求項６】
前記スレッドに関連付けられたダーティフラグが、ローカルデータ構造が修正されていないことを示すことを検出することによって、前記ローカルデータ構造が修正されたかどうかを判定するステップを更に含む請求項５記載のオブジェクトをスレッドに同期させる方法。
【請求項７】
前記オブジェクトを識別するデータをハッシュ関数に適用してハッシュ値を生成するステップを更に含み、
前記ローカルデータ構造を検索するステップが、前記ハッシュ値を使用して、前記特定同期コンストラクトを参照するレファレンスデータを検索することを含む請求項１記載のオブジェクトをスレッドに同期させる方法。
【請求項８】
前記オブジェクトを識別するデータをハッシュ関数に適用してハッシュ値を生成するステップを更に含み、
前記ローカルデータ構造を検索するステップが、前記ハッシュ値を使用して、前記ローカルデータ構造内のレファレンスデータを見つけて特定同期コンストラクトにアクセスすることを含む請求項１記載のオブジェクトをスレッドに同期させる方法。
【請求項９】
前記特定同期コンストラクトが、前記特定同期コンストラクトが関連付けられたオブジェクトを識別するデータを含み、
前記特定同期コンストラクトが関連付けられたオブジェクトを識別する前記データにより前記オブジェクトが識別されたかどうかを判定することによって、前記ローカルデータ構造内の前記レファレンスデータが前記特定同期コンストラクトを参照したかどうかを判定するステップを含む請求項８記載のオブジェクトをスレッドに同期させる方法。
【請求項１０】
オブジェクトに関連付けられた特定同期コンストラクトを参照するレファレンスデータを求めるために、スレッド固有に割り当てられたスレッド−ローカルキャッシュの一部であるローカルデータ構造を検索するステップと、
前記ローカルデータ構造が前記特定同期コンストラクトを参照する前記レファレンスデータを含まない場合、オブジェクトを同期コンストラクトに関連付けるデータを含み、全てのスレッドにより使用されるグローバルデータ構造を使用して、前記特定同期コンストラクトを検索するステップと、
前記特定同期コンストラクトを使用して、前記オブジェクトを前記スレッドに同期させるステップと、
をコンピュータに実現させるためのプログラムが記録されたコンピュータ読出し可能媒体。
【請求項１１】
前記ローカルデータ構造を検索する際に、前記オブジェクトを識別するイン−プログレスレファレンスを設定するステップをコンピュータに実現させるためのプログラム含む請求項10記載のコンピュータ読出し可能媒体。
【請求項１２】
前記イン−プログレスレファレンスが設定された時に、前記オブジェクトと前記特定同期コンストラクトとの関連付けの終了を防止するステップをコンピュータに実現させるためのプログラムを含む請求項11記載のコンピュータ読出し可能媒体。
【請求項１３】
特定オブジェクトと前記特定オブジェクトに関連付けられた特定同期コンストラクトとの関連付けを終了するステップと、
特定オブジェクトの関連付けの終了に応答して、いずれの同期コンストラクトも参照しないように前記レファレンスデータを設定するステップと、
をコンピュータに実現させるためのプログラムを含む請求項10記載のコンピュータ読出し可能媒体。
【請求項１４】
ターミネーション可能状態が検出された時に、前記特定オブジェクトと前記特定オブジェクトに関連付けられた特定同期コンストラクトとの関連付けを終了するステップが最後に実行されてから、前記ローカルデータ構造が修正されたか否かを判定するステップと、
前記ローカルデータ構造が修正された場合、いずれの同期コンストラクタも参照しないように前記ローカルデータ構造のレファレンスデータを設定するステップと、
をコンピュータに実現させるためのプログラムを含む請求項10記載のコンピュータ読出し可能媒体。
【請求項１５】
前記スレッドに関連付けられたダーディフラグが、ローカルデータ構造が修正されていないことを示すことを検出することによって、前記ローカルデータ構造が修正されたかどうかを判定するステップをコンピュータに実現させるためのプログラムを含む請求項14記載のコンピュータ読出し可能媒体。
【請求項１６】
前記オブジェクトを識別するデータをハッシュ関数に適用してハッシュ値を生成するステップををコンピュータに実現させるためのプログラムを含み、
前記ローカルデータ構造を検索するステップが、前記ハッシュ値を使用して、前記特定同期コンストラクトを参照するレファレンスデータを検索することを含む請求項10記載のコンピュータ読出し可能媒体。
【請求項１７】
前記オブジェクトを識別するデータをハッシュ関数に適用してハッシュ値を生成するステップをコンピュータに実現させるためのプログラムを含み、
前記ローカルデータ構造を検索するステップが、前記ハッシュ値を使用して、前記ローカルデータ構造内のレファレンスデータを見つけて特定同期コンストラクトにアクセスすることを含む請求項10記載のコンピュータ読出し可能媒体。
【請求項１８】
前記特定同期コンストラクトが、前記特定同期コンストラクトが関連付けられたオブジェクトを識別するデータを含み、
前記特定同期コンストラクトが関連付けられたオブジェクトを識別する前記データにより前記オブジェクトが識別されたかどうかを判定することによって、前記ローカルデータ構造内の前記レファレンスデータが前記特定同期コンストラクトを参照したかどうかを判定するステップをコンピュータに実現させるプログラムを含む請求項17記載のコンピュータ読出し可能媒体。
【請求項１９】
プロセッサと、
前記プロセッサに連結されるメモリと、
前記メモリ内に記憶された同期コンストラクトのキャッシュと、
前記メモリ内に記憶されて、オブジェクトと前記オブジェクトに関連付けられた同期コンストラクトとを関連付けるデータを含み、全てのスレッドにより使用されるグローバルデータ構造と、
前記メモリ内に記憶されて、スレッド固有に割り当てられるスレッド−ローカルキャッシュと、
前記スレッド−ローカルキャッシュの一部として記憶されるローカルデータ構造と、
を含んで構成され、
前記プロセッサは、オブジェクトに関連付けられた特定同期コンストラクトを参照するレファレンスデータを求めるために、ローカルデータ構造を検索する一方、前記ローカルデータ構造が前記特定同期コンストラクトを参照するレファレンスデータを含まない場合、前記グローバルデータ構造を使用して前記特定同期コンストラクトを検索し、前記特定同期コンストラクトにより前記オブジェクトを前記スレッドに同期させるように構成されたコンピュータシステム。
【請求項２０】
前記プロセッサが、特定オブジェクトと前記特定オブジェクトに関連付けられた特定同期コンストラクトとの関連付けを終了するように構成されるとともに、
前記プロセッサが前記ローカルデータ構造にデータを設定して、いずれの同期コンストラクトも参照しないように構成された請求項19記載のコンピュータシステム。
【発明の詳細な説明】
技術分野
本発明は、一般的に、オブジェクトを実行スレッドに同期させる技術に関し、特に、オブジェクトとオブジェクトを同期させるのに使用されるデータ構造との間の動的関連付けを管理するのに使用される技術に関する。
背景技術
多重スレッド環境によって、スレッドとして知られる処理の異なる部分を同時に実行させることができる。多重スレッド処理を注意深く設計して、多重スレッドを、相互に不必要に干渉することなく、同時に実行できる。
マルチプロセッサコンピュータシステムにおいて、スレッドはマルチプロセッサコンピュータシステムを形成するプロセッサ上で並行して実行できる。更に、プログラムが構成スレッドまで細分化される場合、このようなコンピュータシステムは、同一プログラムの同時実行スレッドが並行して実行できるので、より迅速にプログラムを実行できる。単一プロセッサ、多重タスキングコンピュータシステムもまた、当業者には公知の種々のリソーススケジューリング機構を使用してほとんど同時に多重スレッドを実行できる。
多重スレッドプログラムがオブジェクト−指向の場合、プログラムの各スレッドは個々にオブジェクトのメソッドを呼び出す。しかしながら、プログラム内のソフトウエア制約またはコンピュータシステム内のハードウエア制約のため、予め定義された数のスレッドのみが、ある一定のオブジェクトのメソッドを一度に呼び出すことができる。
例えば、オブジェクトは、一度に１アクセスのみを操作できるI/Oインタフェース等の共有コンピュータリソースにアクセスするメソッドを含む。同時実行スレッドはオブジェクトのメソッドの呼び出しを同時に行おうとするので、このオブジェクトのメソッドへのアクセスは、一度に１スレッドに制限される必要がある。メソッドの実行がこのように制限された場合、このメソッドがメンバーであるオブジェクトは、メソッドに現在アクセスしているスレッドと「同期」しているとされる。
従来、種々の方法が、オブジェクトをスレッドに同期させるために使用されてきた。これらの方法は、ミューテックス（mutexes）、モニタ、セマフォのような同期コンストラクトの使用を含む。同期コンストラクトを管理するための１つの方法、動的関連付け方法、が米国特許出願第08/569,805号、発明の名称「オブジェクト同期モジュール及び減少メモリ要件を備えたメソッド」1995年12月８日出願、発明者Timothy G.Lindholm及びJonathan Payne、に開示されている。
動的関連付け方法において、同期コンストラクトは必要に応じてオブジェクトに関連付けられ、また、関連付けを解除される。例えば、実行時において、スレッドは同期を要求するオブジェクトのメソッドを呼び出すことができる。同期コンストラクトは、同期コンストラクトがオブジェクトとまだ関連付けられていない場合、オブジェクトに関連付けられる。スレッドが、スレッドのオブジェクトとの同期を要求したメソッドを出て、現在オブジェクトとの同期を要求するスレッドが他にない場合、同期コンストラクトはオブジェクトとの関連付けを解除される。
同期コンストラクトは、同期コンストラクトキャッシュとして参照されるデータ構造に記憶される。これらの同期コンストラクトのオブジェクトとの関連付けの管理は、同期コンストラクトキャッシュの一部である、或いは同期コンストラクトキャッシュに関連付けられた、他のデータ構造の使用を必要とする。ハッシュテーブルがオブジェクトを、このオブジェクトに関連付けられた同期コンストラクトにリンクする。フリーリストは、現在どんなオブジェクトとも関連付けられていない同期コンストラクトを識別するエントリを含む。
同期コンストラクトのオブジェクトとの関連付けの管理に伴う操作は、同期コンストラクトキャッシュの一部であるデータ構造（即ち、ハッシュテーブル、同期コンストラクト及びフリーリスト）の使用を必要とする。同期コンストラクトキャッシュは全てのスレッドによって共有されるので、同期コンストラクトキャッシュを表すデータ構造はグローバルデータ構造である。同期コンストラクトキャッシュ内のデータ構造の参照または更新は、同期コンストラクトキャッシュを表すグローバルデータ構造をロックして、データ構造へのアクセスを所望する他の同時に実行するスレッドへのまたはこれらのスレッドからの干渉を防止することが必要である。グローバルデータ構造のロックをここではグローバルロックとする。同期コンストラクトキャッシュはグローバルデータ構造なので、グローバル同期コンストラクトキャッシュと見なすことができる。
他のスレッドによってグローバルにロックされたデータ構造と競合するスレッドは、その他方のスレッドがグローバルロックを解除するまで遅延される。他方のスレッドによってロックされたデータ構造と競合する一方のスレッドによって生じるこのような遅延を、ここでは競合遅延とする。コンピュータシステム内で実行するスレッドがグローバルデータ構造上で実行する操作数を増大させるか、または、スレッド数が増大すると、競合遅延は、しばしば、望ましくないレベルまで増大する。
上記記載に基づいて、従来技術に伴う問題点を解消することが所望される。
発明の開示
オブジェクトと、これらのオブジェクトをスレッドに同期させるのに使用される同期コンストラクトとの関連付けを管理する方法及び装置が提供される。本発明の１態様によれば、１つのオブジェクトに関連付けられた特定同期コンストラクトを見つけるために、まず、スレッドによって使用されるスレッド−ローカルキャッシュが、特定同期コンストラクトを参照するレファレンスデータを求めるために検索される。スレッド−ローカルキャッシュ内に特定同期コンストラクトを参照するレファレンスデータがない場合、グローバルデータ構造が、オブジェクトに関連付けられた同期コンストラクトを参照するレファレンスデータを求めるために検索される。
本発明の他の態様によれば、オブジェクトに関連付けられた特定同期コンストラクトを求めるためにスレッド−ローカルキャッシュが検索されると、スレッド−ローカルキャッシュの一部であるイン−プログレスレファレンスが、オブジェクトを識別する値（例えば、オブジェクトの固有ID）に設定される。何らかのスレッド−ローカルキャッシュのイン−プログレスレファレンスがオブジェクトを参照する場合には、同期コンストラクトとオブジェクトとの間の関連付けは終了しない。このように、ターミネーション可能事象が発生した場合、イン−プログレスレファレンスを設定してオブジェクトを識別することによって、オブジェクトと、オブジェクトに関連付けられた同期コンストラクトとの関連付けの終了が防止できる。
本発明の更に別の態様によれば、オブジェクトの同期コンストラクトとの関連付けは、ガーベッジコレクションとしての処理によってゆっくりと終了する。関連付けが終了して、例えば、同期コンストラクトが、スレッドのオブジェクトへの同期のために必要な時に、同期コンストラクトをオブジェクトとの関連付けのために利用できる。具体的には、ターミネーション可能事象が発生すると、ガーベッジコレクション処理が、オブジェクトとターミネーション基準に一致する同期コンストラクトとの関連付けを終了する。ガーベッジコレクションが実行された後、何らかの同期コンストラクトを参照できるレファレンスデータが設定されて、レファレンスデータはもはや何の同期コンストラクトも参照しないようにする（何らかのスレッド−ローカルキャッシュのイン−プログレスレファレンスによって識別されたオブジェクトに関連付けられた同期コンストラクトをレファレンスデータが参照しない限り）。このようなレファレンスデータのリセットは、特定オブジェクトについて、スレッド−ローカルキャッシュが、オブジェクトとの関連付けがガーベッジコレクションによって終了した同期コンストラクトを参照するレファレンスデータを確実に含まないようにする。
ガーベッジコレクションが最後に実行されてから、スレッド−ローカルキャッシュ内のレファレンスデータが修正されたかどうかを決定するのにダーティフラグが使用される。ガーベッジコレクションが最後に実行されてから、レファレンスデータが修正されないままであれば、オブジェクトとの関連付けがガーベッジコレクションによって終了している同期コンストラクトを参照するレファレンスデータはない。このように、どんなレファレンスデータもリセットする必要がない。
本発明の更に別の態様によれば、特定オブジェクトを識別するデータがハッシュ関数に適用されてハッシュ値を生成する。スレッド−ローカルキャッシュ内のローカルハッシュテーブルのハッシュ値に関連付けられたテーブルは同期コンストラクトにアクセスするのに使用される。オブジェクトを識別する同期コンストラクト内のテーブルは、同期コンストラクトが特定オブジェクトに関連付けられたかどうかを判定する。
本発明を、これに限定されるものではないが、実施例により添付の図面を参照して説明する。同様の要素には同様の符号を付す。
【図面の簡単な説明】
図１は、本発明の実施例が実行されるコンピュータシステムのブロック図である。
図２は、本発明の実施例による、オブジェクトをスレッドに同期させるための、オブジェクト同期モジュールによって使用されるオブジェクト、スレッド及び同期コンストラクトを示すブロック図である。
図３は、本発明の実施例による、オブジェクトをスレッドに同期させるための、オブジェクト同期モジュールによって使用されるモジュールと、オブジェクト同期モジュールによって使用されるデータ構造を示すブロック図である。
図４は、本発明の実施例による、スレッドがオブジェクトとの同期を要求した場合に実行されるステップを示すフローチャートである。
図５は、本発明の実施例による、スレッドがオブジェクトとの非同期を要求した場合に実行されるステップを示すフローチャートである。
図６は、本発明の実施例による、同期コンストラクトのガーベッジコレクションを実行するメソッドのステップを示すフローチャートである。
発明を実施するための最良の形態
オブジェクトと、これらのオブジェクトを同期するのに使用される同期コンストラクトとの関連付けを管理する方法及び装置を説明する。以下の記載において、説明のために、多くの具体例が本発明の完全な理解のために記載されている。しかしながら、本発明がこれらの具体例がなくても実施できることは当業者には明らかである。他の例においては、本発明を不要に曖昧にしないように、公知の構成及び装置がブロック図に示される。
ハードウエアの概要
図１は本発明の実施例が実行されるコンピュータシステム100を示すブロック図である。コンピュータシステム100は、情報を通信するためのバス102或いは他の通信機構と、情報を処理するためにバス102と連結したプロセッサ104と、を有する。コンピュータシステム100はまた、情報及びプロセッサ104によって実行される命令を記憶するためにバス102と連結した、ランダムアクセスメモリ（RAM）または他のダイナミック記憶装置等の、主メモリ106を有する。主メモリ106はまた、プロセッサ104によって実行される命令の実行中に、変数または中間情報を一時的に記憶するのに使用できる。コンピュータシステム100は更に、バス102と連結して静的情報及びプロセッサ104用の命令を記憶するためのリードオンリーメモリ（ROM）108または他の静的記憶装置を有する。磁気ディスクまたは光ディスク等の記憶装置110が設けられて情報及び命令を記憶するためにバス102に連結される。
コンピュータシステム100は、情報をコンピュータユーザに表示するための、陰極線管（CRT）等のディスプレイ112にバス102を介して連結できる。英数字及び他のキーを含む入力装置114は、バス102と連結して情報及びコマンド選択をプロセッサ104に通信する。他のタイプのユーザ入力装置は、方向情報及びコマンド選択をプロセッサ104に通信し、ディスプレイ112上のカーソル移動を制御するためのマウス、トラックボール、カーソル方向キー等のカーソル制御116である。概して、この入力装置は、平面内で位置を特定できる２軸内の２つの自由度、第１の軸（即ち、ｘ）と第２の軸（即ち、ｙ）、を有する。
本発明は、コンピュータシステム100を使用して、オブジェクトと、これらのオブジェクトを同期させるのに使用される同期コンストラクトとの関連付けを管理することに関する。本発明の一実施例によれば、オブジェクトと、これらのオブジェクトを同期させるのに使用される同期コンストラクトとの関連付けの管理は、主メモリ106に含まれる連続した１以上の命令を実行するプロセッサ104に応答してコンピュータシステム100によって提供される。このような命令は、記憶装置110等の他のコンピュータ読出し可能媒体から主メモリ106に読み込まれる。主メモリ106に含まれる一連の命令の実行により、プロセッサ104は、ここに記載される処理ステップを実行する。他の実施例では、ソフトウエア命令に代えて或いはソフトウエア命令と組み合わせてハードワイヤード回路を使用して本発明を実行できる。このように、本発明の実施例はハードウエア回路及びソフトウエアのどんな特定の組み合わせにも限定されるものではない。
ここで使用される用語「コンピュータ読出し可能媒体」は、実行用のプロセッサ104への命令の供給に関与する何らかの媒体を示す。このような媒体は、これに限定されるものではないが、揮発性媒体及び不揮発性媒体を含む多様な形態である。不揮発性媒体は、例えば、光ディスク、磁気ディスク等の記憶装置110を含む。揮発性媒体は、ダイナミックメモリ等の主メモリ106を含む。
コンピュータ読出し可能媒体の一般的形状は、例えば、フロッピーディスク、フレキシブルディスク、ハードディスク、磁気テープ、または他の何らかの磁気媒体、CD−ROM、他の何らかの光媒体、パンチカード、紙テープ、他の何らかのホールパターンを有するフィジカル媒体、RAM、PROM、EPROM、フラッシュEPROM、他の何らかのメモリチップ又はカートリッジ、または他の何らかのコンピュータ読出し可能な媒体、を含む。
多様な形状のコンピュータ読出し可能媒体は、連続した１以上の命令を実行用のプロセッサ104に搬送する。例えば、命令はまず遠隔コンピュータの磁気ディスクに保持される。遠隔コンピュータは命令をそのダイナミックメモリにロードし、モデムを使用して電話線を介して命令を送る。コンピュータシステム100にローカルなモデムは電話線でデータを受信して赤外線送信器を使用してデータを赤外線信号に変換することができる。赤外線検出器が赤外線信号に保持されるデータを受信し、適宜な回路がデータをバス102に送る。バス102は、データを主メモリ106に搬送し、プロセッサ104が命令を主メモリ106から検索し実行する。主メモリ106によって受信された命令は、プロセッサ104による実行の前または後に記憶装置110に任意に記憶できる。
コンピュータシステム100はまた、バス102に連結した通信インタフェース118を有する。通信インタフェース118は、ローカルネットワーク122に接続するネットワークリンク120に連結する双方向通信を提供する。例えば、通信インタフェース118はサービス総合デジタルネットワーク（ISDN）カードまたは対応するタイプの電話線へのデータ通信接続を提供するモデムでよい。他の例として、通信インタフェース118はコンパチブルローカルエリアネットワークへのデータ通信接続を提供するローカルエリアネットワーク（LAN）カードでもよい。ワイヤレスリンクもまた実施できる。このような手段のいずれにおいても、通信インタフェース118は、種々のタイプの情報を表示するデジタルデータストリームを搬送する電気信号、電磁信号または光信号を送受信する。
ネットワークリンク120は、概して、１以上のネットワークを介して他のデータ装置へのデータ通信を提供する。例えば、ネットワークリンク120は、ローカルネットワーク122を介してホストコンピュータ124への接続またはインターネットサービスプロバイダ（ISP）126によって操作されるデータ装置への接続を提供する。ISP126は、次々に、「インターネット」128とされているワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク122及びインターネット128はともに、デジタルデータストリームを搬送する電気信号、電磁信号または光信号を使用する。コンピュータシステム100へのまたコンピュータシステム100からのデジタルデータを搬送する、種々のネットワークを介した信号及びネットワークリンク120上の通信インタフェース118を介した信号は情報を送る典型的な搬送波の形状である。
コンピュータシステム100は、ネットワーク、ネットワークリンク120及び通信インタフェース118を介して、メッセージを送り、プログラムコードを含むデータを受信する。インターネット例では、サーバ130が、インターネット128、ISP126、ローカルネットワーク122及び通信インタフェース118を介して、アプリケーションプログラム用の要求されたコードを送信する。本発明によれば、ここに記載のように、このようにダウンロードされたアプリケーションが、オブジェクトと、これらのオブジェクトを同期するのに使用される同期コンストラクトとの関連付けの管理を提供する。
受信されたコードは、受信されるとプロセッサ104によって実行され、及び／または後の実行のために記憶装置110または他の不揮発性記憶装置に記憶される。このように、コンピュータシステム100は搬送波形状のアプリケーションコードを得る。
機能に関する概要
本明細書に記載のメソッドは、オブジェクトと、オブジェクトをスレッドに同期するのに使用できる広汎なカテゴリーの同期コンストラクト（例えば、ミューテックス、モニタ、セマフォ）との間の動的関連付けの管理に使用される。以下に記載のように、オブジェクトと同期コンストラクトとの間の動的関連付けの管理の１態様は、スレッドによって使用されるスレッド−ローカルキャッシュ内のデータを維持することを含む。「スレッド−ローカルキャッシュ」は、スレッドのプライベート使用のために指定されるデータ構造である。用語「キャッシュ」は、スレッド−ローカルキャッシュの記憶装置を何らかの特定のコンピュータ読出し可能媒体に限定するために使用されるものではない。スレッド−ローカルキャッシュの一部である１以上のデータ構造セットはここでは「ローカルデータ構造」と呼ばれる。
本発明は、スレッド−ローカルキャッシュ内のローカルデータ構造の使用によって、オブジェクトと同期コンストラクトとの間の動的関連付けを有効に管理する。スレッド−ローカルキャッシュの一部であるデータ構造は、スレッドがデータ構造にアクセスする前はロックされる必要はない。このように、グローバルロックによって保護されるグローバルデータ構造（例えば、グローバルハッシュテーブル）を使用して同期コンストラクトを検索することから生じるオーバーヘッド及び競合を回避する。
オブジェクトをスレッドに同期するための同期コンストラクトを使用する際に実行される種々の操作中に、スレッド−ローカルキャッシュ内のデータが、もしあれば、どの同期コンストラクトが所定のオブジェクトに関連付けられているかを検索するのに使用される。コンストラクトを検索するのに使用されるのに加えて、スレッド−ローカルキャッシュ内のデータは更新できる。例えば、スレッド−ローカルキャッシュ内のデータの更新を含む１つの処理はガーベッジコレクションである。
オブジェクトとの同期コンストラクトの現在の関連付けが、同期コンストラクトに関連付けられたオブジェクトの使用に関する、何らかの操作の適宜な機能を容易にするのに使用される場合には、同期コンストラクトは、「使用中」とされる。例えば、同期コンストラクトがスレッドをオブジェクトに同期させるのに使用される場合、同期コンストラクトは使用中である。
オブジェクトと同期コンストラクトとの間の関連付けは、ターミネーション可能事象が発生すると終了できる。ターミネーション可能事象は、何らかの同期コンストラクトがターミネーション基準に一致するかどうかを決定するために、少なくとも１つのどの同期コンストラクトが調べられたかに応答する事象である。ターミネーション可能事象の例としては、スレッド要求同期またはスレッドをオブジェクトに同期させることを必要とする場合に同期コンストラクトを利用できないことを含む。
ターミネーション基準は、同期コンストラクトとオブジェクトとの間の関連付けが終了できるかどうかを決定する基準である。ターミネーション基準は、例えば、オブジェクトと同期するスレッドがなく、しかも、オブジェクトとの同期を待っているスレッドがない等の基準を含む。ターミネーション基準は、部分的には、同期コンストラクトに関連付けられたデータ構造の状態に基づいている。このように、ターミネーション基準は使用される同期のタイプに応じて変化する。ターミネーション基準は同期コンストラクトが使用中かどうかを決定するのに使用される。
ターミネーションが「すばやく」実行されると、同期コンストラクトがもはや使用中ではない状態になった後、ターミネーション可能事象が比較的すぐに発生する。ターミネーションが「ゆっくりと」実行されると、スレッドがもはや「使用中」ではない状態になった後、比較的時間が経過するまでターミネーション可能事象は発生しない。
一定時間オブジェクトに関連付けられたままの同期コンストラクトは、ガーベッジコレクションとして以下に記載される機構を介して他のオブジェクトとの操作に利用できる。ガーベッジコレクションは、ターミネーション可能事象が発生すると実行できる。同期コンストラクトのオブジェクトとの関連付けがガーベッジコレクション中に終了すると、同期コンストラクトは他のオブジェクトを伴う操作に利用できる。
説明のために、同期コンストラクトに関連付けられたオブジェクトのターミネーションをガーベッジコレクション機構例を参照して説明する。しかしながら、本発明は、以下に記載のガーベッジコレクション機構例を介してオブジェクトと同期コンストラクトとの関連付けを終了することに限定されるものではなく、また、このようなターミネーションをゆっくりと実行する機構に限定されるものでもないことは言うまでもない。
説明のために、以下に記載のメソッドを、同期コンストラクトが使用中かどうかを示す同期コンストラクトに関連付けられたデータ構造セット例を参照して示す。これらのデータ構造に加えて、同期ステップ、非同期ステップ及び同期タイプに特有の他の操作を、スレッド−ローカルキャッシュを使用して同期コンストラクトのオブジェクトとの動的関連付けを管理するための以下に記載の機構を理解するのに必要な程度に詳細に説明する。同期コンストラクトの使用中の状態の決定の時期及び一定のタイプの同期コンストラクトに特有の操作が、使用されている同期コンストラクトのタイプに応じて変化する時期は当業者には理解される。
オブジェクト
図２を参照すると、主メモリ106は１組のオブジェクト214を記憶している。各オブジェクト214は０以上のメソッド及びデータ部分、或いはデータ部分のない０以上のメソッドを含む。例えば、オブジェクトＯは同期メソッド200、同期されないメソッド202及びデータ部分204を含む。データ部分204は、オブジェクトＯに関連付けられるデータ及びデータ構造を含む。
各オブジェクト214は固有IDに関連付けられる。オブジェクトに関連付けられる固有IDの生成は当業者には公知である。
説明のため、図２に示されるオブジェクト214は、コンピュータシステム100上で実行するJAVATM実行時環境によって生成される。一般的に、JAVATM実行時環境は、JAVATMバーチャル計算機及び１以上のJAVATMクラスファイルを有する。JAVATMバーチャル計算機は、Tim Lindholm及びFrank Yellinによる「JAVATMバーチャル計算機仕様」（Sun Microsystems,Inc.:Addison−Wesley Publishing Co.）に詳細に記載されている。バイトコードは、公知の翻訳技術を使用してJAVATMに書き込まれたソースコードから生成される。JAVATMプログラム言語は、James Gosling,Bill Joy及びGuy Steeleによる「JAVATM言語仕様」（Sun Microsystems,Inc.:Addison−Wesley Publishing Co.）に詳細に記載され、関連テキストはAddison−Wesleyにより発行されたJAVATMSeriesに記載されている。
オブジェクトと、これらのオブジェクトを同期させるのに使用される同期コンストラクトと、の関連付けを管理するための以下に記載のメソッドが、どんなプログラム言語及びどんな環境でも実行されるオブジェクトに適用できることは当業者には理解される。このため、本発明は、何らかの特定のプログラム言語で実行されるオブジェクトに限定されるものではない。
何らかの特定のオブジェクトに関連付けられた１以上の同期メソッドのうちの１つの同期メソッドには、コンピュータシステム100上で実行する時に予め定義された数のスレッドのみがアクセスできる。同期されるこの予め定義された数のスレッドはここでは１つであると推測される。しかし、ここに記載のメソッドがオブジェクトを複数のスレッドに同期させるのに使用できることは当業者には明らかである。
同期メソッドは、オブジェクト生成者（即ちプログラマー）により同期されたことを明示的に宣言される。同期メソッドがスレッドによって呼び出されると、そのメソッドがメンバーであるオブジェクトが、メソッドの実行が終了するまでそのスレッドと同期される。
更に、いくつかのオブジェクト214は、同期の必要なしに１以上のスレッド216によって同時に実行される、１以上のメソッド202及びデータ部分204内の関連付けられたデータ及びデータ構造を含む。このように、これらのメソッドは同期されず、また、オブジェクト生成者によって同期されたことを宣言されない。
いくつかのオブジェクト214は同期メソッド200及び非同期メソッド202の両方を含む。スレッド216の１つがこのようなオブジェクトのメソッドを呼び出すと、非同期メソッドの１つが呼び出された場合には、オブジェクトはスレッドと同期しない。結果として、非同期メソッドが複数のスレッド216により同時に実行され、また、任意の数のオブジェクトの他の非同期メソッドとともに同時に、または、オブジェクトの同期メソッドとともに同時に実行される場合がある。
同期メソッドの他に、スレッドがオブジェクトと同期する他の状況がある。例えば、いくつかのオブジェクト214は、コードの特定のブロックのみが特定のオブジェクトと同期されたことを明示的に宣言されて、この特定のオブジェクトがこのブロックを実行するスレッドと同期するメソッドを含む。
同期されたコードのセクション（例えば、メソッド及びブロック）を宣言するためのいくつかのシンタックスの変更例を説明したが、他のシンタックスの変更例も可能である。更に、いくつかのプログラム言語及び操作環境において、メソッドは、このメソッドが同期されたことを明示的に宣言することなしに同期できる。このために、本発明は同期メソッドを識別する何らかの特定メソッドに限定されるものではないことが理解される。
分類方法もまた同期されたことを宣言できる。クラスメソッドがクラス全体を代表して呼び出されるが、そのクラスに属する特定オブジェクトを代表して呼び出されることはない。同期されたことを宣言されるクラスメソッドを呼び出すスレッドは、そのクラスに属する特定オブジェクトではなく、クラスと同期する。
説明のために、同期されたことを宣言されるメソッドを含むオブジェクトの同期のみを本発明に関して説明する。しかしながら、本発明は更に、ここに記載の方法を含む他の方法で同期されたオブジェクトまたはクラスにも適用できる。更にまた、本発明が、非オブジェクト指向プログラミングの実行されるロッキング機構を含む他のロッキング機構によって使用されるデータ構造にも適用できることは当業者には明らかである。
オブジェクト同期モジュール例
図３はオブジェクト同期モジュール300の例を示す。オブジェクト同期モジュールは、オブジェクト同期コンストラクト224のキャッシュと、キャッシュマネージャ326と、ガーベッジコレクタ327と、グローバルハッシュテーブル328と、同期コンストラクトフリーリスト330と、を含む。グローバルハッシュテーブル328とフリーリスト330とは、スレッドによってアクセスされる前に、同時アクセスに対してグローバルにロックされるグローバルデータ構造である。
図２を参照すると、同期コンストラクト224は、オブジェクト214をスレッド216に同期させるのに使用される同期コンストラクトである。１つのオブジェクトが１つの同期コンストラクトに関連付けられて、オブジェクトをスレッドに同期させる。スレッドがオブジェクトとの同期を要求するまで、同期コンストラクトは、オブジェクトに関連付けられない。その後、同期コンストラクトは、同期コンストラクトのオブジェクトとの関連付けが以下に説明する方法で終了するまで、オブジェクトに関連付けられたままとなる。
説明のために、各同期コンストラクト224は、典型的なシンクロナイザーリスト（またはオーナーリスト）210と、待機者リスト218と、を含む。典型的なシンクロナイザーリスト210は、現在オブジェクトと同期している（または、オブジェクトを使用している）スレッドをリストする。待機者リスト218は、同期コンストラクトが関連付けられるオブジェクトと同期するために現在待機している全てのスレッドをリストする。
典型的なシンクロナイザーリスト210及び典型的な待機者リスト218は説明を目的とするものであって、オブジェクトを同期するのに具体的に使用されるデータ構造の実際の実行を表わすことを意味するものではない。典型的なシンクロナイザーリスト210と典型的な待機者リスト218とは、以下に説明する典型的な同期及び非同期に特有の操作によって使用されるデータ構造を説明するものとして提供されたものにすぎない。更に、これらの説明的なデータ構造は、同期または非同期に特有のデータ構造が同期コンストラクトがターミネーション基準に一致するかどうかを決定するのにどのように使用されるかの説明を提供するために使用される。特定タイプの同期コンストラクトに特有のデータ構造が、ターミネーション基準が一致するかどうかを決定するのにどのように使用されるかは当業者には明らかである。
各同期コンストラクトはまたオブジェクト識別子212を含む。オブジェクト識別子212は、同期コンストラクトに関連付けれらるオブジェクトの固有IDに設定される。
図３を参照すると、グローバルハッシュテーブル328は１組のポインタ324を含む。ここで使用される用語「ポインタ」は、一般に、他のデータを示すのに使用される任意のデータを意味する。ポインタは、例えば、特定のデータピースの位置を直接または間接に示すアドレスの形態をとる。
各ポインタはグローバルハッシュテーブルアドレスにある。同期されるオブジェクト214の各々はグローバルハッシュテーブル内の対応するアドレスにマップされる。これは、これらのオブジェクトの固有IDの所定のハッシュ関数を演算して対応するグローバルハッシュテーブルアドレスを生成することによって行われる。グローバルハッシュテーブルの寸法を小さく維持するために、ポインタ324の数及び同期コンストラクト224の数をオブジェクトの数より少なくする。しかしながら、ポインタ324の数及び同期コンストラクト224の数は、必要に応じて増大できる。
多数の固有IDが、グローバルハッシュテーブル関数によって同一のグローバルハッシュテーブルアドレスにマップできるので、多数のオブジェクトが同一グローバルハッシュテーブルアドレスにマップできる。多数のオブジェクトを同一グローバルハッシュテーブルアドレスに適宜にマップするために、コンストラクトチェイン380が各グローバルハッシュテーブルアドレスに供給される。コンストラクトチェインは、固有IDが同一グローバルハッシュテーブルアドレスにマップするオブジェクトに現在関連付けられている０以上の同期コンストラクトを含む単一リンクリストである。特定グローバルハッシュテーブルアドレスにおけるポインタは、固有IDが特定グローバルハッシュテーブルアドレスにマップするオブジェクトに現在関連付けられている同期コンストラクトを含むコンストラクトチェインを参照するのに使用される。ポインタがコンストラクトチェインを参照する方法を以下により詳細に説明する。
単一リンクリストは、リスト内の項目を表示するリストである。単一リンクリスト、単一リンクリストに項目を追加するメソッド及び項目を除去するメソッド等の、リストにアクセスしてこれを維持するのに使用されるメソッドは当業者には公知である。
図３に示されるポインタ324の各ポインタは、０以上のコンストラクトである単一にリンクされたリストに対するリスト参照である。例えば、図３のポインタＰは、典型的なコンストラクトチェイン380内の第１の項目（コンストラクト224−Ｌ）を参照するリスト参照である。データ構造を参照するポインタはここでは、データ構造を示すポインタとして参照される。概して、ポインタは、ポインタが示すデータ構造のメモリアドレスを含むとともに、ポインタが示すデータ構造へのアクセスに使用される。
同期コンストラクトを参照する１つのメソッドを説明したが、同期コンストラクトを参照する種々の他のメソッドが可能である。このため、本発明がデータ構造を参照する特定のメソッドに限定されるものではないことは明らかである。例えば、図３のポインタＭは同期コンストラクトのためのハンドルを示す。ハンドル自体が同期コンストラクトに対するポインタである。
スレッド−ローカルキャッシュ
上記のように、本発明は、オブジェクトと同期コンストラクトとの間の動的関連付けを、スレッド−ローカルキャッシュ内のローカルデータ構造の使用によって有効に管理する。スレッド−ローカルキャッシュはスレッド216に割り当てられる。スレッドに割り当てられたスレッド−ローカルキャッシュは、スレッドをオブジェクトに同期させるために現在割り当てられている同期コンストラクトのいくつかを参照するのに使用される情報を含む。
図３は、スレッド216の１つのスレッド−ローカルキャッシュの一部であるローカルデータ構造を示す。図３を参照すると、スレッド−ローカルキャッシュ350は、一組のポインタ364を含むローカルハッシュテーブル368を有する。各ポインタはローカルハッシュテーブルアドレスにある。スレッド−ローカルキャッシュがまずスレッドに割り当てられた時は、１組のポインタ364は、最初はヌルである。ローカルハッシュテーブルアドレス生成器376は、各オブジェクト214のアドレスをマップ（或いはハッシュ）する。これは、これらのオブジェクトの固有IDの所定のハッシュ関数を演算して対応するローカルハッシュテーブルアドレスを生成することによって行われる。ローカルハッシュテーブル368の寸法をスレッド216の各々のスレッド−ローカルキャッシュ内で小さく維持するために、一組のポインタ364内のポインタ数を一組のポインタ324内のポインタ数より少なくすることができる。更に、２以上のオブジェクトの固有IDを、ローカルハッシュテーブル関数によって同一ローカルハッシュテーブルアドレスにマップできる。結果として、ローカルハッシュテーブル衝突が発生する。
図３を参照すると、現在のスレッド372のリストはスレッド216の各々に関連付けられたエントリを含む。各エントリはスレッド−ローカルキャッシュポインタ374のスレッド−ローカルキャッシュポインタを含む。スレッド−ローカルキャッシュポインタは、スレッド−ローカルキャッシュポインタを含む現在のスレッドのリスト内のエントリに関連付けられたスレッドのスレッド−ローカルキャッシュを示す。スレッド−ローカルキャッシュポインタは、スレッド−ローカルキャッシュポインタを含む現在のスレッドのリスト内のエントリに関連付けられたスレッドに割り当てられたスレッド−ローカルキャッシュの一部であるデータ構造にアクセスするのに使用される。
イン−プログレスレファレンス360は、１つのオブジェクトを識別する情報を含むデータ構造である。イン−プログレスレファレンス360に値を割り当てるのはアトミック操作である。このように、スレッドがイン−プログレスレファレンス360に値を割り当てる操作を開始すると、値を割り当てるスレッドの実行は、割り当て操作の完了まで他のスレッドの実行に割り込まれることがない。
オブジェクトと同期コンストラクトとの間の関連付けを終了するのにガーベッジコレクションを使用する実施例では、スレッド−ローカルキャッシュ350はダーティフラグ（dirty flag）362を含むことができる。ダーティフラグ362は、ガーベッジコレクタ327がローカルハッシュテーブル368を変更した後にローカルハッシュテーブル368を変化させたスレッドがあるかどうかを示す。例えば、ガーベッジコレクタ327がローカルハッシュテーブル368内のポインタ364をヌルに設定してポインタがどんな同期コンストラクトも参照しないようにした後、ダーティフラグ362は第１の値に設定される。続いて、いずれかのポインタが同期コンストラクトを参照するように設定されると、ダーティフラグは第２の値に設定される。ガーベッジコレクタが再び呼び出された時、ダーティフラグが依然として第１の値に設定されている場合には、ローカルハッシュテーブル368内のいずれのポインタ364もどんな同期コンストラクトも参照するようには設定されていない。このため、いずれのポインタ364もオブジェクトとの関連付けが終了している同期コンストラクトのいずれも参照しない。従って、ダーティフラグが依然として第１の値に設定されている場合、ガーベッジコレクタはローカルハッシュテーブル368を無視できる。
キャッシュマネージャ326が、どの特定の同期コンストラクトが割り当てられて一定のスレッドを特定オブジェクトに同期させるかを判定した場合、そうであっても、キャッシュマネージャ326は最初にローカルハッシュテーブル368内に含まれる情報を使用しようとする。一般に、どの特定の同期コンストラクトが割り当てられて、一定のスレッドを特定オブジェクトに同期させるかを判定する必要性は、例えば、オブジェクト同期モジュール300がスレッドを特定オブジェクトに同期させるステップを実行する際に生じる。
同期例
同期メソッド例を、図２、図３及び図４を参照して説明する。図２を参照すると、例えば、スレッド216−Ｔがオブジェクト214−Ｏの同期メソッドを呼び出すとする。スレッド216−Ｔはオブジェクト同期モジュール300を呼び出すことによってオブジェクト214−Ｏとの同期を要求する。
図４を参照すると、ステップ410において、オブジェクト同期モジュールはオブジェクトとの同期要求を受信する。同期が要求されたオブジェクトはここでは要求オブジェクトとする。要求オブジェクトとの同期を要求するスレッドはここでは要求スレッドとする。本例では、要求はオブジェクト214−Ｏと同期するためにスレッド216−Ｔにより受信される。
ステップ416では、オブジェクト同期モジュール300はイン−プログレスレファレンス360を要求オブジェクトの固有IDに設定する。ステップ422において要求オブジェクトに関連付けられた同期コンストラクトの検索を開始する前にイン−プログレスレファレンス360にオブジェクトを識別する値を割り当てることによって、イン−プログレスレファレンス360は、スレッドが、識別されたオブジェクトに関連付けられた同期コンストラクトへのアクセスを開始したことを示す。本例では、イン−プログレスレファレンス360はオブジェクト214−Ｏを識別するように設定される。
ステップ422では、要求オブジェクトに現在関連付けられている同期コンストラクトを見つけるための検索がローカルハッシュテーブル368を使用して開始される。キャッシュマネージャ326はローカルハッシュテーブルアドレス生成器376を呼び出して、特定オブジェクトの固有IDがマップされるローカルハッシュテーブルアドレスを生成する。ローカルハッシュテーブルアドレス生成器376は、固有ID上の所定ローカルハッシュ関数を演算してローカルハッシュテーブルアドレスを生成する。その後、キャッシュマネージャ326は、特定オブジェクトの固有IDがマップされるローカルハッシュテーブルアドレスにおけるポインタが、特定オブジェクトに関連付けられた同期コンストラクトを示すかどうかを判定する。キャッシュマネージャ326は、ローカルハッシュテーブルアドレスにおけるポインタによって示された同期コンストラクトにアクセスして同期コンストラクトのオブジェクト識別子を見つけることによってこの判定を行い、特定オブジェクトの固有IDとオブジェクト識別子を比較する。オブジェクト識別子が特定オブジェクトの固有IDと一致すると、ローカルハッシュテーブルアドレスにおけるポインタによって示された同期コンストラクトは特定オブジェクトに関連付けられる。
ステップ428において、キャッシュマネージャ326が、ステップ422において要求オブジェクトと現在関連付けられている同期コンストラクトを見つけるかどうかを判定する。同期コンストラクトが見つかった場合、処理はステップ470に進む。そうでなければ、処理はステップ430に進む。本例では、オブジェクト214−Ｏに対応するローカルハッシュテーブルアドレスにおけるポインタは同期コンストラクトを示す。この同期コンストラクトのオブジェクト識別子は識別オブジェクト214−Ｏとは一致しない。このため、処理はステップ430に進む。
ステップ430では、グローバルハッシュテーブル328がロックされ、処理はステップ434に進む。
ステップ434において、要求オブジェクトと現在関連付けられている同期コンストラクトを見つけるための検索がグローバルハッシュテーブル328に基づいて実行される。キャッシュマネージャ326はオブジェクト固有IDがマップされるグローバルハッシュテーブルアドレスを生成する。これは、固有ID上の所定のハッシュ関数を演算することによって行われる。そして、キャッシュマネージャ326は、生成されたグローバルハッシュテーブルアドレスのポインタをポインタ324に配置する。その後、キャッシュマネージャ326は、配置されたポインタによって示されたコンストラクトチェイン、本例においてはコンストラクトチェイン380、がオブジェクト214−Ｏと現在関連付けられている同期コンストラクトを含むかどうかを判定する。キャッシュマネージャ326は、コンストラクトチェイン380内の同期コンストラクトの各々にアクセスして、アクセスされている同期コンストラクトのオブジェクト識別子212がオブジェクト214−Ｏに対応するかどうかを判定し、検索後オブジェクトが見つかると停止することによって、この判定を行う。本例の場合のように、コンストラクトチェイン380がオブジェクト214−Ｏの固有IDと一致するオブジェクト識別子212を備えた同期コンストラクトを含まない場合、オブジェクト214−Ｏはどんな同期コンストラクトとも現在は関連付けられていない。
ステップ440では、キャッシュマネージャ326がステップ434でコンストラクトを見つけたかどうかを判定する。同期コンストラクトが見つからない場合、処理はステップ446に進む。そうでなければ、処理はステップ450に進む。本例では、コンストラクトチェイン380はオブジェクト214−Ｏを識別するオブジェクト識別子212を備えた同期コンストラクトを含まないので、処理はステップ446に進む。
ステップ446では、オブジェクト同期モジュール300が、フリーリスト330から取り出された同期コンストラクト224−Ｎをオブジェクト214−Ｏに関連付ける。
フリーリスト330は、同期コンストラクト224のコンストラクトの単一リンクリストであり、この場合、オブジェクトに現在は関連付けられていない同期コンストラクト224−Ｍから202−Ｎである。フリーリスト330は、フリーリスト330のポインタを備えたフリーリストヘッダ320を含んで構成される。同期コンストラクトがフリーリスト330から取り出されてオブジェクトに関連付けられると、フリーリスト330はまずロックされた後、同期コンストラクトがフリーリスト330から除去されて配置ポインタによって示されたコンストラクトチェインに追加されたことを反映するように更新される。そして、フリーリスト330はロックが解除される。フリーリスト330からの同期コンストラクト224がオブジェクト214−Ｏに関連付けられる際には、オブジェクト214−Ｏのオブジェクト識別子が、オブジェクトの固有IDに設定されて独自にオブジェクトを識別する。
ステップ450では、同期コンストラクトのオブジェクト214−Ｏとの関連付けに関する具体的な操作が完了しており、グローバルハッシュテーブル328はロックを解除できる。処理はステップ456に進む。
ステップ456では、オブジェクト同期モジュール300は、特定オブジェクト用に前もって生成されたローカルハッシュテーブルアドレスにおけるポインタを設定して、特定オブジェクトに関連付けられた同期コンストラクトを参照する。ポインタの以前の値が上書きされることは言うまでもない。処理はステップ462に進む。
ステップ462では、オブジェクト同期モジュール300は、要求スレッドに割り当てられたスレッド−ローカルキャッシュ内のダーティフラグ308を設定して、ローカルハッシュテーブル368が変更された（即ち、ダーティである）ことを示す。スレッド−ローカルキャッシュ内にダーティフラグがない本発明の実施例では、このステップは省略されることは言うまでもない。処理はステップ470に進む。
ステップ470では、オブジェクト同期モジュール300は、スレッド216−Ｔにオブジェクト214−Ｏを同期させる特有の操作の実行を開始する。これらの操作は、オブジェクト214−Ｏに関連付けられた同期コンストラクトの典型的なシンクロナイザーリスト210が１つのスレッドに対して少なくとも１つのエントリを含むかどうかを判定することを含む。典型的なシンクロナイザーリスト210内に、１つのスレッドに対して何のエントリもない場合、オブジェクト同期モジュール300は要求スレッド用のエントリを関連付けられた同期コンストラクトの典型的なシンクロナイザーリストに追加する。この時点で、要求オブジェクトは要求スレッドと同期する。
本例において、同期コンストラクト224用の典型的なシンクロナイザーリスト210には何のエントリもない。このため、オブジェクト214−Ｏが同期コンストラクト224の典型的なシンクロナイザーリスト210に追加される。この時点で、要求オブジェクト214−Ｏはスレッド216−Ｔと同期する。
一方、典型的なシンクロナイザーリスト210が１つのスレッドに対して１つのエントリを持ち、それがスレッド216−Ｔではない場合、要求スレッド用のエントリが待機者リスト218に追加される。以下により詳細に説明するような方法で、後に、要求スレッドが要求オブジェクトに同期する時に、要求スレッド用のエントリは待機者リスト218から除去される。
ステップ476において、イン−プログレスレファレンス360は空白にされて、どんなオブジェクトの固有IDとも一致しない。ステップ実行が終了する。要求スレッドは、要求オブジェクトの同期メソッド200の実行を開始する。
ステップ428で同期コンストラクトがローカルハッシュテーブル368に基づいて見つかったことが判定された場合、同期コンストラクトはすでに要求オブジェクトに関連付けられている。このため、処理はステップ470に進む。
同期が完了した時のオブジェクトの非同期
ある状態では、オブジェクトとの同期は入れ子である。同期の入れ子は、スレッドがこれとすでに同期しているオブジェクトの同期メソッドを呼び出す際に発生する。例えば、入れ子は、最初にオブジェクトの同期メソッドを呼び出し、続いて、先に呼び出された同期メソッドの実行が終了する前に同一オブジェクトの１つ以上の同期メソッドを呼び出して、スレッドがオブジェクトと同期するようになった時に発生する。
入れ子により、スレッド216の１つがオブジェクト214の１つの同期メソッド200を出ると、オブジェクトのスレッドとの同期は必ずしも完了しない。同期メソッドの続いての各呼び出しまで、オブジェクトはスレッドと同期したままであり、最初の呼び出しが終了する。オブジェクトの同期メソッドの全てのスレッドの呼び出しが終了した後、オブジェクトはスレッドに対して非同期となる。入れ子が発生したかどうかにかかわらず、オブジェクトとこれに関連付けられた同期コンストラクトは、同期コンストラクトが依然として使用中であれば、関連付けられたままである。
使用中でない場合、関連付けは非同期と同時に、すぐに（即ち、すばやく）終了するか、或いは、例えばガーベッジコレクションによって実行されるまで遅延させて（即ち、ゆっくりと）終了する。オブジェクトとの同期が完了すると、スレッドはオブジェクト同期モジュール300を呼び出して、その同期メソッドでは要求スレッドが出ているオブジェクトとの非同期をスレッドが要求することをキャッシュマネージャ326に命令する。スレッドが要求する非同期を要求スレッドとする。要求スレッドが同期を要求するオブジェクトを要求オブジェクトとする。
例えば、スレッド216−１がオブジェクト同期モジュール300を呼び出して、スレッド216−１がオブジェクト214−１との非同期を要求することをオブジェクト同期モジュール300に命令すると、スレッド216−１はオブジェクト214−１と同期し、オブジェクト214−１の同期メソッド200を出す。オブジェクト同期モジュール300は、スレッド216−１がオブジェクト214−１との非同期を要求するスレッド216−１からの要求を受信する。
ステップ520では、オブジェクト同期モジュール300はイン−プログレスレファレンス360を、非同期が要求されるオブジェクトの固有IDに設定する。本例では、イン−プログレスレファレンス360はオブジェクト214−１を識別するように設定される。
ステップ530において、ローカルハッシュテーブル368を使用して、要求オブジェクトと現在関連付けられている同期コンストラクトが検索される。キャッシュマネージャ326がローカルハッシュテーブルアドレス生成器376を呼び出して、特定オブジェクトの固有IDがマップされるローカルハッシュテーブルアドレスを生成する。ローカルハッシュテーブルアドレス生成器376は、固有ID上の所定のローカルハッシュ関数を演算してローカルハッシュテーブルアドレスを生成する。キャッシュマネージャ326は、要求オブジェクトの固有IDがマップされるローカルハッシュテーブルアドレスにおけるポインタを使用して、ポインタによって示された同期コンストラクトにアクセスする。そして、キャッシュマネージャ326は、同期コンストラクトのオブジェクト識別子を要求オブジェクトの固有IDと比較することによって、ポインタによって示された同期コンストラクトが要求オブジェクトに関連付けられたかどうかを判定する。
ステップ540では、要求オブジェクトに関連付けられた同期コンストラクトが見つかったかどうかをローカルハッシュテーブル368に使用して判定する。ステップ530においてアクセスされた同期コンストラクトのオブジェクト識別子が、要求オブジェクトの識別子と一致する場合、要求オブジェクトに関連付けられた同期コンストラクトが見つかる。ステップの実行はステップ560に進む。そうでなければ、処理はステップ550に進む。
本例では、オブジェクト214−１のメモリアドレスにマップされたローカルハッシュテーブルアドレスにおけるポインタは、オブジェクト214−１に関連付けられた同期コンストラクトを示さない。このため、オブジェクトに関連付けられた同期コンストラクトは見つからない。処理はステップ550に進む。
ステップ550では、キャッシュマネージャ326はグローバルハッシュテーブル328に戻って、ステップ430、ステップ434、ステップ450、ステップ456及びステップ462について記載したのと同様の方法で要求オブジェクトに関連付けられた同期コンストラクトを見つける。
本例では、キャッシュマネージャ326はグローバルハッシュテーブル328をロックする。そして、キャッシュマネージャ326はオブジェクト214−１の固有IDに基づいてグローバルハッシュテーブルアドレスを生成し、このグローバルハッシュテーブルアドレスにおけるポインタを使用して、オブジェクト214−１を同期するのに使用される同期コンストラクトを含むコンストラクトチェインにアクセスする。オブジェクト214−１の固有IDは、コンストラクト224−１とオブジェクト214−１に関連付けられた同期コンストラクトとを示すポインタ324−１にマップする。次に、グローバルハッシュテーブル328のロックが解除される。
ステップ560では、オブジェクト同期モジュール300は、要求スレッドが要求オブジェクトから非同期をするための特有の操作を実行する。これらの操作は、要求オブジェクトに関連付けられた同期コンストラクトの典型的なシンクロナイザーリスト210からのスレッドの除去を含む。本例では、スレッド216−１が同期コンストラクト224−１の典型的なシンクロナイザーリスト210から除去される。
同期コンストラクトの待機者リスト218上の１つのスレッドに対して１つのエントリがある場合、スレッド用のエントリが除去され、このスレッド用の１つのエントリが典型的なシンクロナイザーリスト210に追加される。典型的なシンクロナイザーリストに追加されたエントリを備えたスレッドだけが、要求オブジェクトの同期メソッドの実行を開始する。非同期後、同期コンストラクトがそのそれぞれのオブジェクトに関連付けられたままであることは言うまでもない。
本例では、オブジェクト214−１の待機者リスト218が調べられて、同期を待つスレッドを含むかどうかが判定される。オブジェクト214−１の待機者リスト218にはスレッドがないので、処理はステップ570に進む。
ステップ570では、イン−プログレスレファレンス360が空白になるので、どんなオブジェクトも識別しない。ステップの実行を終了する。
ガーベッジコレクション
ガーベッジコレクションは、オブジェクトに現在関連付けられてはいるが、ターミネーション基準に一致した同期コンストラクトを他のオブジェクトに関連付けるのに利用できる。同期コンストラクトのオブジェクトとの関連付けが終了すると、同期コンストラクトが各コンストラクトチェインから除去されてフリーリストに移動する。同期コンストラクトのオブジェクトとの関連付けが終了した後、コンストラクトチェインから除去されフリーリストに移動する同期コンストラクトは、フリーであるとされる。各スレッドのローカルハッシュテーブル368が維持されて、ローカルハッシュ328がオブジェクト同期モジュール300のグローバルデータ構造と一致するようにする。
グローバルデータ構造の状態のスレッドのローカルビューは、スレッドのスレッド−ローカルキャッシュの一部であるローカルデータ構造に基づく。上記のように、２以上のオブジェクトの固有IDは同一ローカルハッシュテーブルアドレスにハッシュできるので、同一ハッシュテーブルアドレスとしてのローカルハッシュテーブルに第２の同期コンストラクトへのポインタを追加した時に、ローカルハッシュテーブルアドレスにおける第１の同期コンストラクトへのポインタが上書きできる。この上書きは、グローバルデータ構造のローカルハッシュテーブル内に維持されるビューが部分的であることを１つの理由とする。
ローカルハッシュテーブルによって維持されるビューは部分的ではあるが、このビューは、ローカルハッシュテーブルに維持されたビューを以下の記載の方法のように同期キャッシュと調和させることによって、維持される。同期コンストラクトがローカルハッシュテーブルアドレスにおけるポインタによって参照されると、ガーベッジコレクタの動作は、同期コンストラクトが実際にオブジェクトに関連付けられてフリーではないことを保証する。同期コンストラクトのオブジェクトとの関連付けが終了した場合、どのローカルハッシュテーブル内においても同期コンストラクトの全てのレファレンスが削除される。
ローカルハッシュテーブル368におけるポインタがどんな同期コンストラクトも示さないように設定される場合には、グローバルデータ構造の正しいビューが維持されることは言うまでもない。どんな同期コンストラクトも示さないようにポインタを設定することにより、キャッシュマネージャが戻って、グローバルハッシュテーブル328を使用して同期コンストラクトにアクセスする。
スレッドのスレッド−ローカルキャッシュが使用されて、上記記載の方法で同期コンストラクトにアクセスした時にガーベッジコレクションを実行するメソッドを図６に示す。図６に示されるステップの説明を補うために、例えば、図３のローカルハッシュテーブル368がスレッド216−１に割り当てられたローカルスレッドキャッシュの一部であるとする。ローカルハッシュテーブル368内のポインタ364−１はコンストラクト224−１を参照し、ポインタ364−２はコンストラクト224−２を参照する。コンストラクト224−１はオブジェクト214−１に関連付けられ、コンストラクト224−２はオブジェクト214−２に関連付けられる。オブジェクト214−１はどのスレッドも同期せず、オブジェクト214−２はスレッド216−２と同期する。スレッド216−１のイン−プログレスレファレンスはオブジェクト214−１を識別するように設定される。スレッド216−１のイン−プログレスレファレンスを設定した直後に、ガーベッジコレクタ327が以下に記載のように呼び出されると、スレッド216−１の実行が中断される。
図６を参照すると、ターミネーション可能状態を検出するオブジェクト同期モジュール300に応答して、ガーベッジコレクタ327がオブジェクト同期モジュール300によって呼び出される。ターミネーション可能状態は、例えば、フリーリスト330が同期コンストラクトのしきい数より少ない数を有することを含む。この状態が発生すると、オブジェクト同期モジュール300は、現在オブジェクトに現在関連付けられてはいるが、ターミネーション基準に一致する同期コンストラクトを以下に記載の方法で解放するようにガーベッジコレクタ327を呼び出す。
１つのターミネーション可能状態を説明したが、他の種々の状態が発生する。このため、本発明は何らかの特定のターミネーション可能状態に限定されるものではないことが理解される。
図６を参照すると、ステップ604では、ガーベッジコレクタ327がフリーリスト330とグローバルハッシュテーブル328をグローバルにロックする。そして、ステップ610では、ガーベッジコレクタ327は、現在のスレッド216のリストへのエントリを繰り返すことによってスレッドを選択する。処理はステップ620に進む。本例では、スレッド216−１が選択されるので、処理はステップ620に進む。
ステップ620では、ガーベッジコレクタ327がスレッドが選択されたかどうかを判定する。スレッドが選択されていれば、処理はステップ624に進む。スレッドが選択されていなければ、各スレッドが繰り返されたままで処理はステップ680に進む。
ステップ680では、ガーベッジコレクタがオブジェクトのターミネーション基準に一致した同期コンストラクトとの関連付けを終了する。同期コンストラクトのオブジェクトとの関連付けの終了は以下により詳細に説明する方法で実行される。
ステップ624では、ガーベッジコレクタ327が、スレッドがダーティとしてフラグされたかどうかを判定する。スレッドがダーティとしてフラグされなかった場合、選択されたスレッドは、ガーベッジコレクタ327の最後の呼び出し以降、そのローカルハッシュテーブルを（例えば、同期コンストラクトに新しいポインタを入れることによって）変更しない。このため、ガーベッジコレクタが何も示さないように設定する新しいポインタがないので、この特定スレッド用のスレッド−ローカルキャッシュが無視される。ガーベッジコレクタ327は、選択されたスレッドに関連付けられたエントリに含まれるスレッド−ローカルキャッシュポインタを使用してダーティフラグ362にアクセスし、ダーティフラグ362に記憶された値を調べることによって、スレッドがダーティとしてフラグされたかどうかを判定する。ダーティフラグ362が、スレッドがダーティではないことを示す値に設定された場合、処理はステップ610に進んで、ガーベッジコレクタ327が他のスレッドを選択する。
本例では、スレッド216−１に割り当てられたスレッド−ローカルキャッシュの一部であるダーティフラグ362が、スレッドがダーティであることを示す値に設定されたとする。本例の場合のように、選択されたスレッドがダーティであると判定された場合、処理はステップ630に進む。
ステップ630では、ガーベッジコレクタ327は、ローカルハッシュテーブルにアクセスして、第１のローカルハッシュテーブルアドレスにおけるポインタで始まる選択されたスレッドのローカルハッシュテーブル368内の次の非ヌルポインタ（次のポインタ）を選択する。処理はステップ640に進む。本例では、選択された次のポインタはポインタ364−１である。
ステップ640では、ガーベッジコレクタ327は、ポインタがローカルハッシュテーブル368から選択されたかどうかを判定する。何も選択されない場合、ガーベッジコレクタ327は全てのポインタについて繰り返し、処理はステップ660に進む。
ステップ660では、ガーベッジコレクタ327は、ダーティフラグ362をスレッドがダーティではないことを示す値に設定しない。処理はステップ610に戻って他のスレッドが選択される。
本例の場合のように、ガーベッジコレクタ327が、ローカルハッシュテーブル368内の次のポインタが選択されたことを判定すると、処理はステップ650に進む。
ステップ650では、ガーベッジコレクタ327は、選択されたポインタによって示された同期コンストラクトがイン−プログレスレファレンス360によって識別された同一オブジェクトに関連付けられたかどうかを判定する。選択されたポインタによって示された同期コンストラクトがイン−プログレスレファレンス360によって識別された同一オブジェクトに関連付けられていない場合、処理はステップ654に進む。
ステップ654において、ガーベッジコレクタ327は選択されたポインタを空白にして同期コンストラクトを示さないようにする。処理はステップ630に戻る。
一方、ステップ650で、選択されたポインタによって示された同期コンストラクトがイン−プログレスレファレンス360によって識別された同一オブジェクトに関連付けられた場合、選択されたスレッドは同期コンストラクトにアクセスする処理にはいる。
イン−プログレスレファレンスは、一方は同期コンストラクトを検索し、他方は同期コンストラクトをガーベッジコレクトしようとする、２つのスレッド間の競合状態に直面してスレッド−ローカルキャッシュの一貫性を保護するのに使用される。この状態は以下に記載のようにして発生する。同期コンストラクトに関連付けられたオブジェクトを識別するために何らかのスレッドに関連付けられたイン−プログレスレファレンスが設定されないことの基準は、その同期コンストラクトのためのターミネーション基準内に含まれる。
イン−プログレスレファレンスの使用が競合状態に直面してスレッド−ローカルキャッシュの一貫性を保護する１つの方法を説明するために、選択されたスレッドがオブジェクトとの同期を要求し、また、選択されたスレッドが、ローカルハッシュテーブル内のポインタにより参照される同期コンストラクトがオブジェクトに関連付けられたことを判定するものとする。この判定の後ではあるが、スレッドがオブジェクトと同期でき、また、オーナーとしてそれ自体確立し、或いは、待機者としてそれ自体確立する前は、多重スレッド環境で生じるように、他のスレッドの実行ができるように、選択されたスレッドの実行がコンピュータシステム100によって中断できる。他のスレッドは、ターミネーション可能状態を経験した後、ガーベッジコレクタ327を呼び出す。これは、ターミネーション基準がイン−プログレスレファレンスに基づくものであること以外、同期コンストラクトのオブジェクトとの関連付けを終了できる。イン−プログレスレファレンスがオブジェクトを参照するように設定されること以外、同期コンストラクトがターミネーション基準に一致することを判定するので、ガーベッジコレクタがこれを行う。選択されたスレッドが再び実行を開始すると、これは、同期コンストラクトが現在フリーであるかまたは何か他のオブジェクトに関連付けられているにもかかわらず、同期コンストラクトが依然として識別されたオブジェクトに関連付けられているという誤ったビューの下で操作されることになる。
ステップ650では、本例においては、コンストラクト224−１は次のポインタであるポインタ364−１によって示された同期コンストラクトである。コンストラクト224−１は、イン−プログレスレファレンス360によって識別されたオブジェクトである、オブジェクト214−１に関連付けられる。そして、処理はステップ630に戻る。
ステップ630では、本例においては、ポインタ364−２は次のポインタとして選択される。ステップ650において、コンストラクト224−１は次のポインタであるポインタ364−２によって示された同期コンストラクトである。コンストラクト224−２はイン−プログレスレファレンス360によって識別されないオブジェクトである、オブジェクト214−２に関連付けられる。そして、処理はステップ654に進む。
ステップ654では、ガーベッジコレクタ327は選択されたポインタであるポインタ364−２を空白にして、同期コンストラクトを示さないようにする。処理はステップ630に戻る。
全てのスレッドが繰り返され、処理がステップ680に進むものとする。ステップ680において、各コンストラクトチェインの各エントリが繰り返され、各同期コンストラクトについて、関連付けターミネーション基準が満たされているかどうか判定される。本発明の１実施例においては、関連付けターミネーション基準は、何のスレッドも同期コンストラクトに関連付けられたオブジェクトと同期せず、何のスレッドもオブジェクトとの同期のために待機せず、何らかのスレッドに関連付けられたイン−プログレスレファレンスがオブジェクトを識別するために設定されない、という条件を含む。
何らかのオブジェクトが同期されたかどうかは、選択された同期コンストラクトの典型的なシンクロナイザーリスト210を調べることによって判定される。典型的なシンクロナイザーリスト210が１つのスレッドに対して１つのエントリを含む場合、同期コンストラクトが関連付けられたオブジェクトがスレッドと同期する。
しかしながら、各々の典型的なシンクロナイザーリスト210が何のスレッドも含まない場合、典型的なシンクロナイザーリスト210が属するオブジェクトはいずれのスレッドとも同期しない。つぎに、何らかのスレッドがオブジェクトとの同期のために待機しているかどうかが判定される。スレッドが同期のために待機しているかどうかは、待機者リスト218を調べることによって判定される。リストが少なくとも１つのスレッドに対して１つのエントリを含んでいる場合、オブジェクトとの同期のために待機するスレッドがある。
ターミネーション基準が含むことのできる１つの条件を説明したが、ターミネーション基準は、上記条件に代えて或いは加えて、他の条件を含むことができる。このため、本発明はターミネーション基準における何らかの特定の条件を含むことに限定されるものではないことが理解される。
上記のように、調べられる同期コンストラクトはコンストラクト224−２である。スレッド216−２へのエントリはコンストラクト224−２の典型的なシンクロナイザーリスト210上で行われる。このように、オブジェクト214−２とコンストラクト224−２との間の関連付けは終了しない。
全ての同期コンストラクトが繰り返された後、処理はステップ690に進む。ステップ690において、ガーベッジコレクタは、グローバルハッシュテーブル328及びフリーリスト330のグローバルロックを解除する（図６、ステップ690）。ステップの実行が終了する。
同期コンストラクトに対するローカルハッシュテーブルポインタが、イン−プログレスレファレンスによって参照されたオブジェクトに関連付けられた同期コンストラクトを参照しなければ、同期コンストラクトのオブジェクトとの関連付けがガーベッジコレクタによって終了するかどうかに関係なく（即ち、関連付けターミネーション基準を満たすかどうかに関係なく）、ポインタは空白になる。本発明は、特定ポインタによって参照される同期コンストラクトがガーベッジコレクタによってフリーになるかどうかに関係なく、ローカルハッシュテーブルアドレスにおける特定ポインタを空白にするメソッドに限定されるものではない。
別の方法、「選択」方法、は、フリーになる同期コンストラクトを示すローカルハッシュテーブル内のポインタのみを空白することを含む。フリーにならない同期コンストラクトを示すポインタを保持することによって、グローバルハッシュテーブルに戻ることが少なくなる。選択方法は、ローカルハッシュテーブルポインタを空白にする際に、どの同期コンストラクトがガーベッジコレクタによってフリーになるかの判定を必然的に伴う。この判定を行うことが、コンピュータリソースに関して、グローバルハッシュテーブルに頻繁に戻すより廉価である状況では、選択メソッドを使用することが望ましい。
ローカルハッシュテーブルのハッシュテーブル衝突を管理する１つのメソッドを説明したが、他の種々のハッシュテーブル衝突機構が可能である。このため、本発明は何らかの特有のハッシュテーブル衝突機構に限定されるものではない。例えば、コンストラクトのローカルチェインは、コンストラクトのローカルチェインが所定数の要素に限定されること以外は、グローバルハッシュテーブルについて記載したのと同様の方法で、ローカルハッシュテーブルアドレス毎に維持できる。コンストラクトのローカルチェイン内の要素数が限定されるとしても、グローバルハッシュテーブルへの戻りの発生が少なくなる。コンストラクトのローカルチェインの維持が、グローバルハッシュテーブルへの頻繁な戻りよりも少ないコンピュータリソースを必要とする場合は、コンストラクトのローカルチェインの使用が望ましい。
他の実施例において、同期または非同期中にスレッド−ローカルキャッシュを使用して同期コンストラクトにアクセスするメソッドは、同期コンストラクトにアクセスする必要性が生じた場合の他の操作に適用される。例えば、同期コンストラクトがモニタの場合、待機装置及び通知装置は同期コンストラクト上で実行される。どの同期コンストラクトが関係するオブジェクトに関連付けられたかの判定は、同期及び非同期に関して説明したのと同様の方法で実行される。
付加的特徴及び変更実施例
本発明の１つの実施例をオブジェクト214をスレッド216に同期させるための実用的な同期コンストラクト224として説明した。これらの同期コンストラクトは、ミューテックス、モニタ及びセマフォ等の公知の同期コンストラクトである。
同期コンストラクト224がミューテックスである場合、ミューテックスはどんな付加的な同期特徴もなしに上記の方法で単に操作するだけである。更に、オブジェクト214の１つと同期できる予め定義された数のスレッド216は一度に１つである。また、同期のために待機するスレッドの数はいくつでもよい。
しかしながら、同期コンストラクト224がモニタの場合、これらの状況可変待機者リスト（典型的な待機者リスト218と混同してはならない）を付加的に含む。モニタの状況可変待機者リストは、その同期をモニタでモニタされたオブジェクトとの同期を停止し、その状態のままのスレッド216のリストを含む。待機しているスレッドは他のスレッドによって通知され、待機中のスレッドは中断されない。そして、スレッドはまずモニタロックを要求し、通常は状況が正しいかどうかを再チェックする。モニタである同期コンストラクト用の関連付けターミネーション基準は、何のオブジェクトも状況可変待機者リストにないことを含む。
同期コンストラクト224がセマフォの場合、一度にオブジェクト224の１つに同期できる予め定義された数のスレッド216はある整数Ｎである。結果として、Ｎ個までのスレッドが、オブジェクトが現在同期されているＮ個のスレッドを表示する典型的なシンクロナイザーリスト210にリストされる。
上記明細書において、本発明は特定の実施例を参照して説明されたが、種々の修正及び変更が本発明の精神及び範囲から逸脱しない限り可能なことはあきらかである。従って、明細書及び図面は、限定的意味ではなく説明のためのものである。
【図１】
0003609426.tif 000002
【図２】
0003609426.tif 000003
【図３】
0003609426.tif 000004
【図４】
0003609426.tif 000005
【図５】
0003609426.tif 000006
【図６】
0003609426.tif 000007