java.lang.Object
java.lang.ref.Reference<T>
- 类型参数:
T- 对象的类型
- 已知子类:
PhantomReference,SoftReference,WeakReference
public abstract sealed class Reference<T> extends Object permits PhantomReference <T>, SoftReference <T>, WeakReference <T> (not exhaustive)
引用对象的抽象基类。此类定义所有引用对象共有的操作。因为引用对象是与垃圾收集器密切合作实现的,所以这个类可能不会被直接子类化。
-
方法总结
修饰符和类型方法描述voidclear()清除此引用对象。protected Objectclone()booleanenqueue()清除此引用对象并将其添加到它注册的队列(如果有)。get()返回此引用对象的引用对象。boolean已弃用。此方法最初指定用于测试引用对象是否已被清除并入队,但从未实现以进行此测试。static voidreachabilityFence(Object ref) 确保给定引用所引用的对象保持 strongly reachable ,而不管程序之前的任何操作是否可能导致对象变得无法访问;因此,被引用的对象至少在调用此方法之前不能被垃圾回收回收。final boolean测试此引用对象的引用对象是否为obj。
-
方法详情
-
get
返回此引用对象的引用对象。如果此引用对象已被程序或垃圾收集器清除,则此方法返回null。- API 注意:
-
此方法返回对引用对象的强引用。这可能会导致垃圾收集器将其视为强可达,直到稍后的收集周期为止。
refersTo方法可以在测试某个对象是否是引用对象的引用对象时避免这种强化;也就是说,使用ref.refersTo(obj)而不是ref.get() == obj。 - 返回:
-
此引用所指的对象,如果此引用对象已被清除,则为
null - 参见:
-
refersTo
测试此引用对象的引用对象是否为obj。如果引用对象已被清除,则使用nullobj将返回true。- 参数:
obj- 与此引用对象的引用对象进行比较的对象- 返回:
true如果obj是这个引用对象的引用- 自从:
- 16
-
clear
public void clear()清除此引用对象。调用此方法不会导致此对象入队。此方法仅由 Java 代码调用;当垃圾收集器清除引用时,它会直接清除引用,而无需调用此方法。
-
isEnqueued
已弃用。此方法最初指定用于测试引用对象是否已被清除并入队,但从未实现以进行此测试。由于固有的竞争条件或没有关联的ReferenceQueue,此方法可能会被滥用。依赖此方法释放关键资源的应用程序可能会导致严重的性能问题。应用程序应使用ReferenceQueue来可靠地确定哪些引用对象已入队或使用refersTo(null)来确定此引用对象是否已被清除。测试此引用对象是否在其关联队列中(如果有)。仅当满足以下所有条件时,此方法才返回true:- 此引用对象在创建时已注册到队列;和
- 垃圾收集器已将此引用对象添加到队列中或调用了
enqueue();和 - 此引用对象尚未从队列中删除。
false。如果此引用对象已被清除但由于竞争条件而未入队,则此方法可能返回false。- 返回:
true当且仅当此引用对象在其关联队列中(如果有)。
-
enqueue
public boolean enqueue()清除此引用对象并将其添加到它注册的队列(如果有)。此方法仅由 Java 代码调用;当垃圾收集器将引用排入队列时,它会直接这样做,而无需调用此方法。
- 返回:
true如果此引用对象已成功入队;false如果它已经入队或者在创建时没有在队列中注册
-
clone
- 重写:
clone在类Object中- 返回:
- 永远不会正常返回
- 抛出:
CloneNotSupportedException- 总是- 自从:
- 11
- 参见:
-
reachabilityFence
确保给定引用所引用的对象保持 strongly reachable ,而不管程序之前的任何操作是否可能导致对象变得无法访问;因此,被引用的对象至少在调用此方法之前不能被垃圾回收回收。调用此方法本身不会启动垃圾收集或终结。此方法针对垃圾收集为 strong reachability 建立排序。它控制在其他情况下仅隐含在程序中的关系——触发垃圾收集的可达性条件。此方法设计用于过早终止的罕见情况,在这种情况下,无法使用
synchronized块或方法,或无法使用其他同步设施或无法提供所需的控制。此方法仅适用于回收可能具有可见效果的情况,这对于具有终结器的对象是可能的(参见 Section 12.6 ofJava 语言规范) 以依赖于正确性的排序控制的方式实现。- API 注意:
-
每当虚拟机检测到没有对象的引用将存储在堆中时,可能会发生终结:垃圾收集器可能会回收该对象,即使该对象的字段仍在使用中,只要该对象否则变得无法访问.在以下示例中,与类关联的簿记通过数组索引管理的情况下,这可能会产生令人惊讶和不良的影响。在这里,
action方法使用reachabilityFence来确保在对关联的ExternalResource执行簿记之前不回收Resource对象;特别是这里,以确保持有ExternalResource的数组插槽不会在方法Object.finalize()中被清零,否则可能会同时运行。
在这里,对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的调用非直观地放置在 after 对update的调用,以确保在更新之前数组槽不会被Object.finalize()清空,即使对action的调用是该对象的最后一次使用。例如,如果用户程序中的用法具有new Resource().action();形式,其中不保留对此Resource的其他引用,则可能是这种情况。reachabilityFence被放置在finally块中,以确保它在方法中的所有路径中被调用,虽然在这里可能有点矫枉过正。在具有更复杂控制路径的方法中,您可能需要进一步的预防措施以确保在所有这些路径中遇到reachabilityFence。有时可以更好地封装
reachabilityFence的使用。继续上面的例子,如果对方法update的调用是可以接受的,即使终结器已经执行(清空槽),那么你可以本地化使用reachabilityFence:public void action2() { // ... Resource.update(getExternalResource()); } private ExternalResource getExternalResource() { ExternalResource ext = externalResourceArray[myIndex]; Reference.reachabilityFence(this); return ext; }在本身确保可达性的构造中不需要方法
reachabilityFence。例如,因为通常无法回收被锁定的对象,所以如果在Resource类(包括finalize)的所有方法中对对象的所有访问都包含在synchronized (this)块中就足够了。 (此外,此类块不得包含无限循环,或者它们本身不可访问,这属于“一般”免责声明的极端情况例外。)但是,在这种方法效率不高的情况下,方法reachabilityFence仍然是更好的选择,可取的,或可能的;例如因为它会遇到死锁。 - 参数:
ref- 参考。如果是null,则此方法无效。- 自从:
- 9
-