弱引用通过放置在引用队列上原子清除?

时间:2018-01-24 20:30:53

标签: java

Java GC是否通过在分配给该引用的ReferenceQueue上放置弱引用来原子清除弱引用?换句话说,如果对WeakReference.get()的调用返回null,那么WeakReference会在队列中吗?

2 个答案:

答案 0 :(得分:3)

让我们解析WeakReference的Javadoc

  

假设垃圾收集器确定某个点   一个对象弱可达的时间。

     

那时它会原子地清除对此的所有弱引用   对象和对任何其他弱可达对象的所有弱引用   从那个强大而柔软的链条可以到达那个物体   引用。

     

与此同时,它将宣布所有以前的弱可达性   对象可以最终确定。

     

同时或稍后   将那些已注册的新清除的弱引用排入队列   参考队列。

看起来步骤如下:

  1. 确定对象是否可以弱到达。

  2. WeakReference清除该对象。 WeakReference.get 将返回null

  3. 将该对象标记为可终结。

  4. 其他时间之后或者将其排队 WeakReference进入队列(如果WeakReference创建了 一个队列)。

  5. 这意味着即使WeakReference.get()返回null,也不能保证WeakReference.enqueuetrueReferenceQueue.poll不会返回{{1} }。

    有关详情,请参阅https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references

      

    参考队列

         

    一旦WeakReference开始返回null,它指向的对象   已经成为垃圾,而WeakReference对象也是如此   无用。这通常意味着某种清理工作   例如,WeakHashMap必须删除此类已解散的条目   避免持有越来越多的deadWeakReferences。

         

    ReferenceQueue类可以轻松跟踪死亡情况   引用。如果您将ReferenceQueue传递给弱引用   构造函数,引用对象将自动插入   引用它的对象成为引用队列   垃圾。然后,您可以按照一定的时间间隔处理   ReferenceQueue并执行死亡所需的任何清理工作   引用。

    示例代码显示:

    null

答案 1 :(得分:0)

  

Java GC是否通过在分配给该引用的ReferenceQueue上放置弱引用来原子地清除弱引用?

没有。排队'at the same time or some later time'。该规范没有任何原子性。

  

换句话说,如果对WeakReference.get()的调用返回null,WeakReference是否会在队列中?

不一定。请注意,这根本不是“换句话说”:它不是同一个问题。