ClassValue.Remove(Class) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
指定したクラスの関連付けられている値を削除します。
[Android.Runtime.Register("remove", "(Ljava/lang/Class;)V", "GetRemove_Ljava_lang_Class_Handler", ApiSince=34)]
public virtual void Remove(Java.Lang.Class? type);
[<Android.Runtime.Register("remove", "(Ljava/lang/Class;)V", "GetRemove_Ljava_lang_Class_Handler", ApiSince=34)>]
abstract member Remove : Java.Lang.Class -> unit
override this.Remove : Java.Lang.Class -> unit
パラメーター
- type
- Class
クラス値を削除する必要がある型
- 属性
注釈
指定したクラスの関連付けられている値を削除します。 その後、この値が同じクラスに対して読み取 #get 場合、その値は #computeValue computeValue メソッドを呼び出すことによって再初期化されます。 これにより、指定されたクラスに対して computeValue メソッドが追加で呼び出される可能性があります。
get呼び出しとremove呼び出しの間の相互作用を説明するには、初期化されていない状態と初期化された状態の間の代替を考慮に入れて、クラス値の状態遷移をモデル化する必要があります。 これを行うには、これらの状態を 0 から順番に番号付けし、初期化されていない (または削除された) 状態には偶数で番号が付けられますが、初期化 (または再初期化) 状態には奇数が付けられます。
スレッド T が状態 2Nのクラス値を削除しても、クラス値は既に初期化されていないので、何も起こりません。 それ以外の場合、状態はアトミックに 2N+1に進まれます。
スレッドT状態2Nのクラス値を照会すると、スレッドはまず、2N+1を呼び出して結果の値をインストールすることによって、クラス値を状態computeValueに初期化しようとします。
Tが新しく計算された値をインストールしようとすると、状態がまだ2N場合、クラス値は計算値で初期化され、状態2N+1に進みます。
それ以外の場合、新しい状態が偶数か奇数かにかかわらず、 T は新しく計算された値を破棄し、 get 操作を再試行します。
破棄と再試行は重要な条件です。そうしないと、 T が致命的に古い値をインストールする可能性があるためです。 たとえば、<ul><li>T はCV.get(C)を呼び出し、状態2N<li を確認>T時間依存値V0を迅速に計算し、<li をインストールする準備が整います。>Tは、不運なページングまたはスケジューリング イベントによってヒットし、<li>...一方、T2はCV.get(C)を呼び出して状態2N<liを確認>T2同様の時間依存値V1を迅速に計算し、CV.get(C)<li>T2(または第3のスレッド)にインストールしてから、CV.remove(C)を呼び出します。 T2の作業<を元に戻す>T2の前の操作が<繰り返されます>関連する計算値は時間の経過と同時に変化します:V1、V2、... <li>...一方、Tは起動し、V0のインストールを試みます。<em>これは失敗する必要があります</em></ul>上のシナリオでは、CV.computeValueがロックを使用して、V1を計算する際に時間依存状態を適切に観察すると仮定できます。computeValueでのTの戻り値と新しい値のインストールの間には時間枠があるため、古い値の脅威は削除されません。 この間、ユーザー同期は実行できません。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。