clear () impl в LinkedList Java - PullRequest
       15

clear () impl в LinkedList Java

11 голосов
/ 23 февраля 2009

Боюсь, это действительно глупый вопрос, но здесь говорится:

Почему метод clear в реализации Java по умолчанию LinkedList не позволяет просматривать список и отсоединять все узлы? Почему бы просто не отцепить заголовок и не подключить остальную часть списка - GC все равно его получит, нет?

Вот метод:

/**
 * Removes all of the elements from this list.
 */
public void clear() {
    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        e.next = e.previous = null;
        e.element = null;
        e = next;
    }
    header.next = header.previous = header;
    size = 0;
modCount++;
}

Зачем ходить? Почему бы просто не перейти к header.next = header.previous = header;?

Насколько я могу понять, это помогает ГК ...? Эта ссылка http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 как бы подсказывает, что.

ТИА ...

Ответы [ 4 ]

18 голосов
/ 23 февраля 2009

Их метод гарантирует, что, даже если другой код все еще содержит ссылки на конкретные узлы, другие узлы будут GC'едированы.

В противном случае, даже одна внешняя ссылка на один из узлов не позволит собрать всю цепочку.

Кроме того, другие операции в списке могут выполняться одновременно (например, просмотры через subList() или Collections.unmodifiableList(), итераторы), и это гарантирует, что эти вещи сразу воспримут список как «пустой».

2 голосов
/ 23 февраля 2009

IIRC, это было изменение, внесенное в JDK6 для повышения производительности некоторых (генерационных) алгоритмов GC. Часто сам List и более старые узлы будут в более старшем поколении, чем некоторые другие узлы. Молодое поколение будет собираться чаще, в результате чего молодые узлы копируются до того, как обнаруживается, что все узлы являются мусором.

Так что это небольшая оптимизация производительности. Оптимизация производительности памяти немного странная в том смысле, что часто не код вызывает проблему, которая требует дополнительного времени для выполнения.

0 голосов
/ 29 июня 2014

Исходный код java.util.LinkedList в http://developer.classpath.org/doc/java/util/LinkedList-source.html предполагает, что вы можете просто установить первый и последний элементы в null.

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

0 голосов
/ 29 мая 2009

Я размышлял над этой самой проблемой в своем блоге по разработке игр. Спасибо за ответ. Я бы поспорил, что экспозиция узла была сомнительным разрешением проекта. Также схематично, что альтернативные представления в списке (итераторы и т. Д.) Будут полагаться на связь между узлами и отказоустойчивость. Вместо того, чтобы полагаться на это поведение побочного эффекта, подвиды в списке должны проверять количество модификаций. В любом случае, я понимаю, почему они застряли с этим сейчас.

...