Java 弱/软/虚引用清除的并发保证

Java 弱/软/虚引用清除的并发保证,java,reference,garbage-collection,Java,Reference,Garbage Collection,除了强引用,还有三种不同的“类*引用”:弱引用、软引用和幻影引用。可能还有其他问题,但它们要么扩展了其中一个,要么与我的问题无关 如果一个对象在GC循环中不是强可访问的,它将被垃圾收集(即,最终确定并从内存中删除)。但是在收集之前,任何*引用都会被清除——这取决于可达性条件、要清除的*引用的类型、内存需求等 我想知道,JLS是否对是否原子/同时清除同一对象的所有*相同类型的引用做出了任何保证,或者是否有轻微的可能性(即“竞争条件”),即某些*引用被清除,而其他*相同类型的引用则不被清除,因此对象

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

如果一个对象在GC循环中不是强可访问的,它将被垃圾收集(即,最终确定并从内存中删除)。但是在收集之前,任何*引用都会被清除——这取决于可达性条件、要清除的*引用的类型、内存需求等

我想知道,JLS是否对是否原子/同时清除同一对象的所有*相同类型的引用做出了任何保证,或者是否有轻微的可能性(即“竞争条件”),即某些*引用被清除,而其他*相同类型的引用则不被清除,因此对象可能会被恢复(即再次被强引用)通过剩余的*引用之一,尽管某些*同类引用已被清除并排队


从另一个角度重新表述的问题:是否可以安全地假设清除的*引用意味着以前引用的对象无法通过同一类型的不同*引用恢复?

您可以参考文档

:

[垃圾收集器]可以选择以原子方式清除该对象的所有软引用以及通过强引用链可访问该对象的任何其他软可访问对象的所有软引用

:

[垃圾收集器]将以原子方式清除对该对象的所有弱引用,以及对任何其他弱可访问对象的所有弱引用,该对象可通过强引用和软引用链访问


这一点是没有意义的,因为引用对象无法从中检索(
get
总是返回null)。

我不能给你一个“硬”字回答,但我知道这是自git发布以来Java的一个问题。弱引用和终结器的原始设计没有经过深思熟虑,也不清楚修复它的尝试是否成功。是的,但是..仍然留有一些回旋余地wrt if(所有特定对象的软引用,例如)将在非GC线程中以原子方式清除。或者如果一个(但不是所有多个)未清除的SoftReference可能会恢复一个对象。@user2864740文档说清除是原子的。摆动空间在哪里?它要么是原子的,要么不是。(我想)我知道JVM在GC周期中基本上是冻结的我的问题是,文档中的“原子性”是指“一次清除所有此类*引用”还是仅“一次清除所有此类*引用”。请对我最初重新表述的问题给出一个明确的答案:清除的*引用是否意味着,以前引用的对象不能通过相同类型的*引用(或相同类型或任何更强的*引用的纠缠链)恢复?@Robin479文档清楚地说明了“原子清除对该对象的所有弱引用,以及通过强引用和软引用链可访问该对象的任何其他弱可访问对象的所有弱引用”。您在最后一句中描述的引用要么包含在该规范中,要么不存在。将“原子级”单独指代一个引用是没有意义的。我想如果你问我是否认为文档中使用的措辞模棱两可,我不这么认为。“原子级全部清除”是相当明确的。