弱引用不会返回null,即使实际引用对象没有强引用。

7

我正在阅读有关java中弱引用的以下帖子:

了解弱引用。

在阅读理论部分之后,尝试测试弱引用是否为null条件。但是,在以下代码中,弱引用的null检查永远不会返回true:

package com.weak;

import java.lang.ref.WeakReference;

class Widget{}

public class WeakReferenceDemo {

    public static void main(String[] args) throws InterruptedException {

        Widget widget = new Widget() ;
        WeakReference<Widget> valueWrapper = new WeakReference<Widget>(widget) ;

        System.out.println( valueWrapper.get() );

        //here strong reference to object is lost
        widget = null ;

        int count = 0 ;

        //here checking for null condition
        while( valueWrapper.get() != null ){
            System.out.print(".");
            Thread.sleep(432) ;

            if(++count % 25 == 0)   System.out.println();
        }

        System.out.println( valueWrapper.get() );
    }
}

请问为什么 valueWrapper.get() 不会返回 null,尽管 widget 的引用已被赋值为 null?
谢谢。

4
GC不是引用计数,当您将引用设置为null时,GC甚至还不知道它-它会在下一个垃圾回收周期中找到它。 - harold
2个回答

11

不要等待垃圾回收,尝试使用 Runtime.getRuntime().gc() 手动调用它,然后检查弱引用是否为 null

只有在GC运行时,弱可达对象才会被回收。由于程序没有实例化任何新的对象到堆上,所以如果不手动请求运行,可能永远不会发生。


1

WeakReference.get() 方法在垃圾回收器确定对象只有弱引用时才会返回 null。这可能需要一些时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接