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
のクラス値に対してクエリを実行すると、スレッドはまず、結果の値を呼び出してインストールすることによって、クラス値を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
時に適切に観察すると仮定できます。これにより、 の戻りcomputeValue
T
値と新しい値のインストールの間に時間枠があるため、古い値の脅威は削除されません。 この間、ユーザー同期は実行できません。
の java.lang.ClassValue.remove(java.lang.Class<?>)
Java ドキュメント。
このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。