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

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

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

java.lang.ClassValue.remove(java.lang.Class<?>)Java 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

适用于