Module  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来确保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