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

为了解释和调用之间的getremove交互,我们必须对类值的状态转换进行建模,以考虑未初始化状态和初始化状态之间的交替。 为此,请按零顺序对这些状态进行编号,并请注意,未初始化(或已删除)状态使用偶数进行编号,而初始化状态(或重新初始化)状态具有奇数。

当线程 T 删除处于状态 2N的类值时,不会发生任何情况,因为类值已经未初始化。 否则,状态以原子方式提升到 2N+1

当线程T查询处于状态2N的类值时,该线程首先尝试通过调用computeValue并安装生成的值来初始化类值以状态2N+1

当尝试安装新计算的值时 T ,如果状态仍处于此状态 2N,则类值将使用计算值进行初始化,并将其提升为状态 2N+1

否则,无论新状态是偶数还是奇数, T 都将放弃新计算的值,然后重试 get 该操作。

放弃和重试是一个重要的 proviso,因为否则 T 可能会安装灾难性过时的值。 例如:<ul><li>T 调用CV.get(C)并看到状态 2N<li>T 快速计算一个依赖于时间的值V0,并准备好安装它 <liT> 被一个不幸的分页或计划事件击中,并进入睡眠长时间<的 li...>同时,T2还调用CV.get(C)并看到状态<2N liT2> 快速计算类似的时间依赖值V1,并将其安装在<CV.get(C) liT2>(或第三线程)上,然后调用CV.remove(C),撤消T2的工作<李>之前的操作T2也重复了几次 <li>,相关的计算值随时间变化:V1V2,...。 <li>...同时,T唤醒并尝试安装V0; <em>这必须失败</em></ul> 我们可以假设在上述方案中CV.computeValue使用锁来正确观察时间依赖状态,因为它的计算V1等。这不会消除过时值的威胁,因为返回computeValueT与安装新值之间存在时间窗口。 在此期间,无法进行用户同步。

适用于 . 的 java.lang.ClassValue.remove(java.lang.Class<?>)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于