- java.lang.Object
-
- java.lang.ref.Reference<T>
-
- 已知直接子类:
-
PhantomReference
,SoftReference
,WeakReference
public abstract class Reference<T> extends Object
参考对象的抽象基类。 该类定义了所有引用对象共同的操作。 由于引用对象与垃圾收集器密切配合实现,所以该类可能不会被直接子类化。- 从以下版本开始:
- 1.2
-
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 void
clear()
清除此参考对象。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
如果它已经入队了,或者如果它没有在创建队列时注册
-
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
来确保Resource
对象在已经执行关联的ExternalResource
上的记账之前未被回收; 特别是在这里,为了确保在方法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();
,则不会对此Resource
保留其他引用,则可能是这种Resource
。 虽然这里可能是过度的,reachabilityFence
被放置在一个finally
块中,以确保在方法中的所有路径上调用它。 在具有更复杂控制路径的方法中,您可能需要进一步的预防措施,以确保所有这些reachabilityFence
都遇到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)
块中就synchronized (this)
。 (此外,这些块不能包括无限循环,或者它们本身是不可达到的,这些循环落入“一般”免责声明中的角落外的例外。)然而,方法reachabilityFence
在这种方法效率不高的情况下仍然是更好的选择,可取的或可能的; 例如因为它会遇到死锁。 - 参数
-
ref
- 参考。 如果是null
,这个方法没有效果。 - 从以下版本开始:
- 9
-
-