ClassValue.Remove(Class) メソッド

定義

指定したクラスの関連付けられた値を削除します。

[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のクラス値に対してクエリを実行すると、スレッドはまず、結果の値を呼び出してインストールすることによって、クラス値をcomputeValue状態2N+1に初期化しようとします。

T新しく計算された値をインストールしようとすると、状態がまだ である2N場合、クラス値は計算値で初期化され、状態2N+1に進みます。

それ以外の場合、新しい状態が偶数であるか奇数であるかに関係なく、 T 新しく計算された値が破棄され、操作が再試行されます get

破棄と再試行は重要な証明です。そうしないと T 、悲惨な古い値がインストールされる可能性があるためです。 たとえば、<ul<>li>T がを呼び出CV.get(C)して状態 2N<li>T を確認すると、時間に依存する値V0をすばやく計算し、インストールする<準備が整います。T>これは、不運なページングまたはスケジュール 設定イベントによってヒットし、長時間<>スリープ状態になります。一方、また、 T2 を呼び出CV.get(C)して、状態<2N liT2> が同様の時間依存値V1をすばやく計算し、li>T2 (または 3 番目のスレッド) に<CV.get(C)インストールしてから を呼び出CV.remove(C)し、 の前のアクションT2を元に戻す T2' の作業 <li> が数回<繰り返されます li> も繰り返され、関連する計算値は時間の経過と同時に変化します。 V1, V2, ... <li>...その間、T目を覚まし、インストールV0を試みます。 <em>this must fail</em></ul> 上記のシナリオCV.computeValueでは、ロックを使用して、時間に依存する状態を計算V1時に適切に観察すると仮定できます。これにより、 の戻りcomputeValueT値と新しい値のインストールの間に時間枠があるため、古い値の脅威は削除されません。 この間、ユーザー同期は実行できません。

java.lang.ClassValue.remove(java.lang.Class<?>)Java ドキュメント。

このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。

適用対象