Sprache

ClassValue.Remove(Class) Methode

Definition

Entfernt den zugeordneten Wert für die angegebene Klasse.

[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

Parameter

type
Class

Der Typ, dessen Klassenwert entfernt werden muss

Attribute

Hinweise

Entfernt den zugeordneten Wert für die angegebene Klasse. Wenn dieser Wert anschließend #get für dieselbe Klasse gelesen wird, wird der Wert durch Aufrufen der #computeValue computeValue Methode erneut initialisiert. Dies kann zu einem zusätzlichen Aufruf der computeValue Methode für die angegebene Klasse führen.

Um die Interaktion zwischen get und remove Aufrufen zu erläutern, müssen wir die Zustandsübergänge eines Klassenwerts modellieren, um die Änderung zwischen nicht initialisierten und initialisierten Zuständen zu berücksichtigen. Dazu nummerieren Sie diese Zustände sequenziell von Null, und beachten Sie, dass nicht initialisierte (oder entfernte) Zustände mit geraden Zahlen nummeriert werden, während initialisierte (oder neu initialisierte) Zustände ungerade Zahlen aufweisen.

Wenn ein Thread T einen Klassenwert im Zustand 2Nentfernt, geschieht nichts, da der Klassenwert bereits nicht initialisiert ist. Andernfalls wird der Zustand atomisch zu 2N+1.

Wenn ein Thread T einen Klassenwert im Zustand 2Nabfragt, versucht der Thread zunächst, den Klassenwert durch Aufrufen 2N+1 und Installieren des resultierenden Werts zu computeValue initialisieren.

Wenn T versucht wird, den neu berechneten Wert zu installieren, wird der Klassenwert nach 2Nwie vor mit dem berechneten Wert initialisiert und in den Zustand 2N+1verschoben.

Andernfalls wird der neu berechnete Wert verworfen, unabhängig davon, ob der neue Zustand gerade oder ungerade ist, T und der get Vorgang wird erneut ausgeführt.

Verwerfen und Wiederholen ist ein wichtiger Vorbehalt, da andernfalls T potenziell ein katastrophaler veralteter Wert installiert werden könnte. Zum Beispiel: <Ul><li-Anrufe>TCV.get(C) und sieht Zustand2N< li>T schnell berechnet einen zeitabhängigen Wert V0 und kann bereit sein, es <zu installieren li>T wird durch eine unglückliche Paging- oder Terminplanungsereignis getroffen und geht für eine lange Zeit<> in den Ruhezustand... T2 unterdessen ruft auch CV.get(C) Zustand 2N<li>T2 schnell berechnet einen ähnlichen zeitabhängigen Wert V1 und installiert ihn aufCV.get(C)< li>T2 (oder einem dritten Thread) dann ruftCV.remove(C), und das Rückgängigmachen T2von 's Arbeit <li> die vorherigen Aktionen von T2 werden mehrmals <li> wiederholt, auch die relevanten berechneten Werte ändern sich im Laufe der Zeit: V1, , , ... V2<li>... T in der Zwischenzeit wacht auf und versucht, zu installieren V0; <em>this must fail</em></ul> We can assume in the above scenario that CV.computeValue uses locks to properly observe the time-dependent states as it computes V1, etc. Dadurch wird die Bedrohung eines veralteten Werts nicht entfernt, da zwischen der Rückgabe und computeValueT der Installation des neuen Werts ein Zeitfenster vorhanden ist. Während dieser Zeit ist keine Benutzersynchronisierung möglich.

Java Dokumentation für java.lang.ClassValue.remove(java.lang.Class<?>).

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Gilt für: