模块  java.base
软件包  java.lang.ref

Class Reference<T>

  • 已知直接子类:
    PhantomReferenceSoftReferenceWeakReference

    public abstract class Reference<T>extends Object
    引用对象的抽象基类。 此类定义所有引用对象共有的操作。 由于引用对象是与垃圾收集器密切配合实现的,因此该类可能不会直接进行子类化。
    从以下版本开始:
    1.2
    • 方法详细信息

      • 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来确保在关联的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