Java: кто меняет размер, когда записи WeakHashMap выселяют? - PullRequest
0 голосов
/ 05 октября 2018

В последнее время я пытаюсь выяснить, как работает WeakHashMap.Как показывает код, map.isEmpty() вернет true после System.gc() и size со строгой ссылкой, так кто же изменит размер?

    WeakHashMap<UniqueKey, BigImage> map = new WeakHashMap<>();

    UniqueKey key = new UniqueKey("abc");
    map.put(key, new BigImage());
    BigImage value = map.get(key);
    assertNotNull(value);

    key = null;
    System.gc();

    Thread.sleep(1000);
    assertTrue(map.isEmpty());

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Посмотрите на реализацию внутри:

public int size() {
    if (size == 0)
        return 0;
    expungeStaleEntries();
    return size;
}

специально для expungeStaleEntries метода, который использует:

/**
 * Reference queue for cleared WeakEntries
 */
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();

Этот метод также обновляет size, прежде чем он будет возвращен вам,

0 голосов
/ 05 октября 2018

Устаревшие записи удаляются при вызове метода size().

Метод size() внутренне вызывает закрытый метод expungeStaleEntries(), чтобы удалить устаревшие записи (конечно, если этоеще не пусто).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...