Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает WeakHashMap 'under the hood' / 6 сообщений из 6, страница 1 из 1
29.01.2017, 12:15
    #39393975
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает WeakHashMap 'under the hood'
Как мне было известно до чтения исходников(везде так пишут) 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
29.01.2017, 12:39
    #39393980
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает WeakHashMap 'under the hood'
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.Такие структуры данных (как WeakHashMap) используются при промежуточной обработке.
Допустим, у нас есть набор объектов, которые мы хотим представить
в виде хэш-мэпа (напр., формирование дерева). Но объекты-значения
будут использоваться в последующей обработки.

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

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

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

Мы же вызываем просто super(key, queue); , что есть конструктор WeakReference
...
Рейтинг: 0 / 0
30.01.2017, 10:43
    #39394415
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает WeakHashMap 'under the hood'
questionerС одной стороны Entry имеет weak ссылку на ключ, strong ссылку на значение. С другой стороны вся Entry это weak ссылка. Что будет если weak ссылка имеет внутри strong ссылку.
Где слабо там и рвется.
...
Рейтинг: 0 / 0
30.01.2017, 11:01
    #39394442
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает WeakHashMap 'under the hood'
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
30.01.2017, 11:56
    #39394491
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает WeakHashMap 'under the hood'
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Как работает WeakHashMap 'under the hood' / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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