Freigeben über


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 für dieselbe Klasse #get gelesen wird, wird sein 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 erklären, müssen wir die Zustandsübergänge eines Klassenwerts modellieren, um den Wechsel zwischen nicht initialisierten und initialisierten Zuständen zu berücksichtigen. Nummerieren Sie dazu diese Zustände sequenziell von 0, 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 atomar in 2N+1erweitert.

Wenn ein Thread T einen Klassenwert im Zustand 2Nabfragt, versucht der Thread zunächst, den Klassenwert in den Zustand 2N+1 zu initialisieren, indem er den resultierenden Wert aufruft computeValue und installiert.

Wenn T versucht wird, den neu berechneten Wert zu installieren, wird der 2NKlassenwert 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 wiederholen Sie den get Vorgang.

Verwerfen und wiederholen ist eine wichtige Bedingung, da andernfalls T möglicherweise ein katastrophal veralteter Wert installiert werden könnte. Beispiel: <ul><li>T ruft auf CV.get(C) und sieht zustand 2N<li>T berechnet schnell einen zeitabhängigen Wert V0 und macht sich bereit, ihn <zu installieren liT> wird von einem unglücklichen Paging- oder Terminplanungsereignis getroffen und wechselt in den Ruhezustand für eine lange Zeit <li...>T2 in der Zwischenzeit auch aufruft CV.get(C) und sieht state 2N<li>T2 schnell einen ähnlichen zeitabhängigen Wert V1 berechnet und installiert ihn auf CV.get(C)<liT2> (oder einem dritten Thread), dann ruft CV.remove(C), rückgängig machenT2<>, die vorherigen Aktionen von T2 werden mehrmals <li> wiederholt, die relevanten berechneten Werte ändern sich im Laufe der Zeit: V1, V2, ... <li>... wacht T inzwischen auf und versucht, zu installierenV0; <em>this must fail</em></ul> Wir können im obigen Szenario davon ausgehen, dass sperren verwendet werden, CV.computeValue um die zeitabhängigen V1Zustände ordnungsgemäß zu beobachten, während sie berechnet, usw. Dadurch wird die Bedrohung eines veralteten Werts nicht beseitigt, da zwischen der Rückgabe von computeValue in T und der Installation des neuen Werts ein Zeitfenster liegt. 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, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In der Attribution License beschriebenen Begriffen verwendet werden.

Gilt für: