WeakReference не возвращает ноль, хотя нет сильных ссылок на реальный объект ссылки - PullRequest
7 голосов
/ 20 октября 2011

Я прохожу следующий пост на Слабые ссылки в Java: -

Понимание слабых ссылок.

После прохождения теоретическогочасть, пытаясь проверить слабую ссылку для нулевого условия .Но проверка нуля для слабой ссылки никогда не возвращает истину в следующем коде: -

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 () не возвращает нольХотя виджет ссылка имеет нулевое значение.

Спасибо.

Ответы [ 2 ]

11 голосов
/ 20 октября 2011

Вместо того чтобы ждать сборки мусора, попробуйте вызвать его самостоятельно с помощью Runtime.getRuntime().gc(), а затем проверьте слабую ссылку для null.

Слабо достижимые объекты возвращаются только при запуске GC.Поскольку ваша программа больше не создает экземпляры объектов в куче, это может никогда не произойти, если вручную не запустить ее.

2 голосов
/ 20 октября 2011

WeakReference.get () не возвращает ноль, пока сборщик мусора не доходит до определения того, что объект только слабо доступен.Это может занять некоторое время.

...