- java.lang.Object
-
- java.lang.ref.Reference<T>
-
- 已知直接子类:
-
PhantomReference,SoftReference,WeakReference
public abstract class Reference<T> extends Object
引用对象的抽象基类。 此类定义所有引用对象共有的操作。 由于引用对象是与垃圾收集器密切配合实现的,因此该类可能不会直接进行子类化。- 从以下版本开始:
- 1.2
-
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 voidclear()清除此参考对象。protected Objectclone()booleanenqueue()清除此引用对象并将其添加到与其注册的队列(如果有)。Tget()返回此引用对象的引用对象。booleanisEnqueued()通过程序或垃圾收集器判断此引用对象是否已入队。static voidreachabilityFence(Object ref)确保给定引用引用的对象保持为strongly reachable ,无论程序的任何先前操作是否可能导致对象无法访问; 因此,至少在调用此方法之前,引用的对象不能通过垃圾收集回收。
-
-
-
方法详细信息
-
get
public T get()
返回此引用对象的引用对象。 如果已通过程序或垃圾收集器清除此引用对象,则此方法返回null。- 结果
-
此引用所引用的对象,如果已清除此引用对象,
null
-
clear
public void clear()
清除此参考对象。 调用此方法不会导致此对象入队。此方法仅由Java代码调用; 当垃圾收集器清除引用时,它直接执行,而不调用此方法。
-
isEnqueued
public boolean isEnqueued()
通过程序或垃圾收集器判断此引用对象是否已入队。 如果此引用对象在创建时未在队列中注册,则此方法将始终返回false。- 结果
-
true当且仅当此参考对象已入队时
-
enqueue
public boolean enqueue()
清除此引用对象并将其添加到与其注册的队列(如果有)。此方法仅由Java代码调用; 当垃圾收集器对引用进行排队时,它会直接执行,而不会调用此方法。
- 结果
-
true如果此参考对象已成功入队;false如果它已经入队,或者在创建时没有在队列中注册
-
clone
protected Object clone() throws CloneNotSupportedException
- 重写:
-
clone在类Object - 结果
- 这个实例的克隆。
- 异常
-
CloneNotSupportedException- 永远 - 从以下版本开始:
- 11
- 另请参见:
-
Cloneable
-
reachabilityFence
public static void reachabilityFence(Object ref)
确保给定引用引用的对象保持为strongly reachable ,无论程序的任何先前操作是否可能导致对象无法访问; 因此,至少在调用此方法之前,引用的对象不能通过垃圾收集回收。 调用此方法本身不会启动垃圾收集或完成。该方法针对垃圾收集建立了strong reachability的排序。 它控制只在程序中隐含的关系 - 触发垃圾收集的可达性条件。 此方法设计用于过早终结的不常见情况,其中使用
synchronized块或方法,或使用其他同步设施是不可能的或不提供所需的控制。 此方法仅在回收可能具有可见效果时才适用,对于具有终结器(参见Section 12.6 17 of The Java™ Language Specification )的对象,这些对象可以通过依赖于排序控制来确保正确性的方式实现。- API Note:
-
只要虚拟机检测到对象的任何引用都不会存储在堆中,就可能发生终结:即使该对象的字段仍在使用中,垃圾收集器也可以回收对象,只要该对象无法访问即可。
在诸如以下示例的情况下,这可能具有令人惊讶和不期望的效果,其中与类相关联的簿记通过数组索引来管理。
这里,方法
action使用reachabilityFence来确保在关联的ExternalResource上的簿记之前不回收Resource对象; 特别是在这里,为了确保在方法Object.finalize()中没有清除保存ExternalResource的阵列槽,否则可能同时运行。这里,class Resource { private static ExternalResource[] externalResourceArray = ... int myIndex; Resource(...) { myIndex = ... externalResourceArray[myIndex] = ...; ... } protected void finalize() { externalResourceArray[myIndex] = null; ... } public void action() { try { // ... int i = myIndex; Resource.update(externalResourceArray[i]); } finally { Reference.reachabilityFence(this); } } private static void update(ExternalResource ext) { ext.status = ...; } }reachabilityFence的调用在调用reachabilityFence之后update,以确保在更新之前Object.finalize()没有排除数组插槽,即使对action的调用是最后一次使用此对象。 例如,如果用户程序中的用法具有new Resource().action();,而该格式new Resource().action();保留对此Resource其他引用,则可能是这种Resource。 虽然这里可能reachabilityFence过分,但reachabilityFence放在finally块中,以确保在方法中的所有路径上调用它。 在具有更复杂控制路径的方法中,您可能需要进一步的预防措施以确保在所有这些reachabilityFence中遇到reachabilityFence。有时可以更好地封装使用
reachabilityFence。 继续上面的例子,如果对方法update的调用是可接受的,即使终结器已经执行(nulling out slot),那么你可以本地化使用reachabilityFence:public void action2() { // ... Resource.update(getExternalResource()); } private ExternalResource getExternalResource() { ExternalResource ext = externalResourceArray[myIndex]; Reference.reachabilityFence(this); return ext; }在自身确保可达性的结构中不需要方法
reachabilityFence。 例如,因为通常不能回收被锁定的对象,所以在Resource类(包括finalize)的所有方法中对对象的所有访问都包含在synchronized (this)块中就synchronized (this)。 (此外,此类块不得包含无限循环,或者本身无法访问,这些都属于“一般”免责声明中的例外情况。)但是,如果此方法效率不高,方法reachabilityFence仍然是更好的选择。理想的,或可能的; 例如,因为它会遇到死锁。 - 参数
-
ref- 参考。 如果是null,则此方法无效。 - 从以下版本开始:
- 9
-
-