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
。
为了解释 和 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
、、。 <V2
li>...同时,T
唤醒并尝试安装 V0
; <em>这必须失败</em></ul> 我们可以假设在上述方案中CV.computeValue
使用锁在计算 V1
时正确观察依赖于时间的状态,等等。这不会消除过时值的威胁,因为从 中返回computeValue
T
到安装新值之间有一个时间窗口。 在此期间无法进行用户同步。
的 java.lang.ClassValue.remove(java.lang.Class<?>)
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。