- java.lang.Object
-
- java.lang.ref.Reference<T>
-
- 已知直接子类:
-
PhantomReference
,SoftReference
,WeakReference
public abstract class Reference<T> extends Object
引用对象的抽象基类。 此类定义所有引用对象共有的操作。 由于引用对象是与垃圾收集器密切配合实现的,因此该类可能不会直接进行子类化。- 从以下版本开始:
- 1.2
-
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 void
clear()
清除此参考对象。protected Object
clone()
boolean
enqueue()
清除此引用对象并将其添加到与其注册的队列(如果有)。T
get()
返回此引用对象的引用对象。boolean
isEnqueued()
通过程序或垃圾收集器判断此引用对象是否已入队。static void
reachabilityFence(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
-
-