public abstract class ClassValue<T> extends Object
ClassValue
缓存来完成消息的发送信息,每一类中遇到的。
protected abstract T computeValue(类<?> type)
ClassValue
。
该方法将被调用在第一个线程访问值与get
方法。
通常情况下,这种方法是调用一次每班,但它可能被再次调用如果有电话remove
。
如果此方法抛出一个异常,对get
相应的调用将终止异常与异常,没课的价值将被记录。
type
的类的类型值必须计算
ClassValue
有关,对于给定的类或接口
get(java.lang.Class<?>)
,
remove(java.lang.Class<?>)
public T get(类<?> type)
computeValue
方法调用了。
的值班上的实际安装是自动执行。在这一点上,如果几个赛车线程计算值,一个选择,并返回到所有的赛车线程。
的type
参数通常是一个类,但它可以是任何类型,如一个接口,一个原始类型(如int.class
),或void.class
。
在remove
电话的情况下,一个类的值有一个简单的状态图:未初始化,初始化。当remove
调用了,价值观察规则更加复杂。更多信息请看remove
文档。
type
的类的类型值必须计算或检索
ClassValue
相关的当前值,对于给定的类或接口
NullPointerException
-如果参数为空
remove(java.lang.Class<?>)
,
computeValue(java.lang.Class<?>)
public void remove(类<?> type)
computeValue
方法。这可能会导致对给定类的
computeValue
额外调用方法。
为了解释get
和remove
电话之间的相互作用,我们必须模型一类值的状态过渡到考虑到未初始化,初始化状态的交替。为此,这些国家依次从零,并注意初始化(或删除)状态编号为偶数时初始化(或重新初始化)州有奇数。
当一个线程T
删除状态2N
,一类价值没有发生,因为类的值已经初始化。否则,国家先进的原子能2N+1
。
当一个线程T
查询状态2N
类值,线程首先尝试初始化类价值状态2N+1
通过调用computeValue
和安装所产生的价值。
当T
尝试安装新的计算值,如果国家依然在2N
,类的值将被计算的值初始化,推进国家2N+1
。
否则,无论是新的国家是偶数还是奇数,T
会丢弃新计算值并重试get
操作。
丢弃后重试是一个重要的条件,否则T
可能安装一个灾难性的陈旧的价值。例如:
T
电话CV.get(C)
和见状2N
T
快速计算时间价值V0
准备安装T
遭遇不幸的分页或调度事件,去睡很长时间T2
也称CV.get(C)
和见状2N
T2
迅速计算出一个类似的时间价值V1
并安装在CV.get(C)
T2
(或三分之一线)然后调用CV.remove(C)
,毁灭T2
的工作T2
动作重复几次V1
,V2
,…T
醒来并试图安装V0
;这必须失败CV.computeValue
使用锁来正确地观察随时间变化的状态,计算
V1
,等这不会删除过期数据的威胁,因为有
computeValue
在
T
的回归和新价值之间安装一个时间窗口。在此期间,没有可能使用用户同步。
type
的类的类型值必须被移除
NullPointerException
-如果参数为空
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.