除了强烈引用外,还有三种不同的*参考":WeakReference,SoftReference和PhantomReference。可能还有其他人,但他们会延伸一个或与我的问题无关。
如果某个对象在GC循环期间无法强烈访问,则会收集垃圾(即已完成并从内存中删除)。但在收集之前,任何*参考都被清除 - 取决于可达性条件,*要清除的参考类型,内存需求等。
我想知道,如果JLS对同一对象的所有*引用是否原子/同时清除,或者是否存在轻微机会(即"竞争条件&#34)有任何保证。 ;),一些*引用被清除而其他*同类型的引用不被清除,这样一个对象可能会被剩余的*引用之一复活(即被强烈引用),尽管有些*引用相同善良已经被清除和排队。
从不同的POV重新提出的问题:假设清除*参考意味着先前引用的对象不能通过相同类型的不同*引用复活,是否安全?
答案 0 :(得分:4)
您可以参考文档。
[垃圾收集器]可以选择清除原子对该对象的所有软引用以及对通过一系列强引用可从中访问该对象的任何其他可轻松访问的对象的所有软引用。
[垃圾收集器]将原子清除对该对象的所有弱引用以及对任何其他弱可达对象的所有弱引用,通过一系列强引用和软引用可以从该对象访问该对象。
PhantomReference
的观点没有实际意义,因为无法从中检索引用对象(get
始终返回null)。