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互動,我們必須建模類別值的狀態轉換,以考慮未初始化與初始化狀態之間的交替。 為此,從零依序編號這些狀態,並注意未初始化(或移除)狀態以偶數編號,而初始化(或重新初始化)狀態則為奇數。
當執行緒 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(或第三執行緒)上,然後呼叫 CV.remove(C),撤銷 T2<的工作 Li>,先前的操作T2會重複多次 <Li>,且相關的計算值隨時間改變:V1, V2, ... <李>......同時,他T醒來並嘗試安裝V0; <em>這必須失敗</em></ul> 我們可以假設在上述情境CV.computeValue中,利用鎖來正確觀察時間相關的狀態,並計算 V1,等等。這並不能消除過時的威脅,因為從 in computeValue 回歸T到新值安裝之間存在一段時間。 此期間無法進行使用者同步。
Java 文件 java.lang.ClassValue.remove(java.lang.Class<?>)。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。