powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает WeakHashMap 'under the hood'
6 сообщений из 6, страница 1 из 1
Как работает WeakHashMap 'under the hood'
    #39393975
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как мне было известно до чтения исходников(везде так пишут) WeakHashMap это пары состоящие из
1. weak ссылка на ключ и
2. Значение

судя по коду при вставке элемента в мапу мы делаем что-то типа

Код: java
1.
 tab[i] = new Entry<>(k, value, queue, h, e);



где queue это ReferenceQueue.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
        ....
        Entry(Object key, V value,
              ReferenceQueue<Object> queue,
              int hash, Entry<K,V> next) {
            super(key, queue);
            this.value = value;
            this.hash  = hash;
            this.next  = next;
        }
        ....





так же я заметил, что ещё одним важным методом, который используется является метод expungeStaleEntries.
Как я понял он вызывается на каждую операцию.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
private void expungeStaleEntries() {
        for (Object x; (x = queue.poll()) != null; ) {
            synchronized (queue) {
                @SuppressWarnings("unchecked")
                    Entry<K,V> e = (Entry<K,V>) x;
                int i = indexFor(e.hash, table.length);

                Entry<K,V> prev = table[i];
                Entry<K,V> p = prev;
                while (p != null) {
                    Entry<K,V> next = p.next;
                    if (p == e) {
                        if (prev == e)
                            table[i] = next;
                        else
                            prev.next = next;
                        // Must not null out e.next;
                        // stale entries may be in use by a HashIterator
                        e.value = null; // Help GC
                        size--;
                        break;
                    }
                    prev = p;
                    p = next;
                }
            }
        }
    }



Тут я начинаю немного плыть.

С одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.

Не знаю почему, но логика подсказывает, что всё таки ключ может быть собран GC, а значение придётся чистить самому(судя по методу expungeStaleEntries)


Дальше идёт сильное непонимание происходящего. Насколько я понимаюю weak ссылки(видимо как-то не так я это делаю) в очередь ссылка попадает уже когда объект на который она указывала уже того(память из под него освобождена)

В нашем случае мы складывали в очередь только key, а достаём (Entry<K,V>) x.

Разъясните, пожалуйста, непонимание.
...
Рейтинг: 0 / 0
Как работает WeakHashMap 'under the hood'
    #39393980
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.Такие структуры данных (как WeakHashMap) используются при промежуточной обработке.
Допустим, у нас есть набор объектов, которые мы хотим представить
в виде хэш-мэпа (напр., формирование дерева). Но объекты-значения
будут использоваться в последующей обработки.

Самое главное - мы не теряем данные, даже если произойдет GC.
...
Рейтинг: 0 / 0
Как работает WeakHashMap 'under the hood'
    #39393995
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

вопрос не про использование, а про внутреннее устройство.

Вот как GC понимает, что нужно положить в queue именно Entry, а не WeakReference.

Мы же вызываем просто super(key, queue); , что есть конструктор WeakReference
...
Рейтинг: 0 / 0
Как работает WeakHashMap 'under the hood'
    #39394415
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.
Где слабо там и рвется.
...
Рейтинг: 0 / 0
Как работает WeakHashMap 'under the hood'
    #39394442
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerДальше идёт сильное непонимание происходящего. Насколько я понимаюю weak ссылки(видимо как-то не так я это делаю) в очередь ссылка попадает уже когда объект на который она указывала уже того(память из под него освобождена)

В нашем случае мы складывали в очередь только key, а достаём (Entry<K,V>) x.
Где это?
Код: java
1.
2.
3.
4.
 Reference<Object> r;
...
 ReferenceQueue<Object> q = r.queue;
 if (q != ReferenceQueue.NULL) q.enqueue(r);


Вроде бы сам Reference, т.е. в данном случае его наследник Entry<K,V>
...
Рейтинг: 0 / 0
Как работает WeakHashMap 'under the hood'
    #39394491
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение.Strong-ссылки идут извнеquestionerС другой стороны вся Entry это weak ссылка.Да
Код: java
1.
static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> { ... }


questionerЧто будет если weak ссылка имеет внутри strong ссылку.Со strong-ссылкой ничего не случится. Пострадает только weak-объект.
При желании можно заWRAPать значение перед вставкой: m.put(key, new WeakReference (value))
questionerНе знаю почему, но логика подсказывает, что всё таки ключ может быть собран GC, а значение придётся чистить самому(судя по методу expungeStaleEntries)Не сам ключ, а вся запись Entry<K,V> (т.к. extends WeakReference<Object> ).questionerВ нашем случае мы складывали в очередь только keyв ReferenceQueue?questionerа достаём (Entry<K,V>) xТак работают все Map'ы.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает WeakHashMap 'under the hood'
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]