java - Weak/Soft/Phantom Reference清算的并发保证

标签 java reference garbage-collection

除了强引用之外,还有三种不同的“*引用”:WeakReference、SoftReference 和 PhantomReference。可能还有其他的,但它们要么扩展其中一个,要么与我的问题无关。

如果一个对象在 GC 循环期间不是强可达的,它就会被垃圾收集(即完成并从内存中删除)。但在它被收集之前,任何 *Reference 都会被清除——这取决于可达性条件、要清除的 *Reference 的类型、内存需求等。

我想知道,如果 JLS 对同一对象的所有同类 * 引用是否被自动/同时清除,或者是否有很小的机会(即“竞争条件”)做出任何保证,那么一些*引用被清除,而其他同类*引用则没有,这样一个对象可能会通过剩余的*引用之一恢复(即再次被强烈引用),尽管一些同类*引用已经被清除并入队。

从不同的 POV 改写的问题:假设已清除的 *Reference 意味着先前引用的对象不能通过同类的不同 *Reference 恢复是否安全?

最佳答案

您可以引用文档。

SoftReference :

[The garbage collector] may choose to clear atomically all soft references to that object and all soft references to any other softly-reachable objects from which that object is reachable through a chain of strong references.

WeakReference :

[The garbage collector] will atomically clear all weak references to that object and all weak references to any other weakly-reachable objects from which that object is reachable through a chain of strong and soft references.

这一点对于 PhantomReference 没有实际意义因为无法从中检索引用对象(get 始终返回 null)。

关于java - Weak/Soft/Phantom Reference清算的并发保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28573166/

相关文章:

java - 当公共(public)代码有多个不兼容的返回类型时分解公共(public)代码

c++ - 将资源锁定对象作为参数传递

C++ 流引用作为类成员

Scala:变量引用

java - 一半的堆使用率,但很多 ehcache 未命中

java - 具有相同返回类型的方法出现未经检查的赋值警告

java - 如果我们有压倒性的概念,为什么还要抽象呢?

Java从字符串中解析日期

java - 下面的代码中有垃圾回收吗?

java - G1GC和SGen GC的主要区别是什么