Они могут быть полезны для параллельных структур данных.
(Ниже приведен пример одновременного использования в реальном мире, которого не было бы, если бы @ Neil не упомянул FORTRAN. ;-)
Например, ConcurrentDictionary<TKey, TValue>
в .NET 4.0 RC использует связанные списки для объединения элементов, которые хэшируются в один и тот же сегмент.
Базовая структура данных для ConcurrentStack<T>
также является связанным списком.
ConcurrentStack<T>
является одной из структур данных, которые служат основой для нового пула потоков (с локальными «очередями», реализованными, по сути, в виде стеков). (Другая основная опорная конструкция ConcurrentQueue<T>
.)
Новый пул потоков, в свою очередь, обеспечивает основу для планирования работы нового
Task Parallel Library .
Так что они, безусловно, могут быть полезны - связанный список в настоящее время служит одной из основных структур поддержки, по крайней мере, одной замечательной новой технологии.
(Одиночно-связанный список делает убедительный без блокировки - но не без ожидания - выбор в этих случаях, потому что основные операции могут быть выполнены с помощью одного CAS (+ повторные попытки).
В современной среде GC-d, такой как Java и .NET, проблемы ABA можно легко избежать.
Просто оберните элементы, которые вы добавляете в только что созданные узлы, и не используйте эти узлы повторно - пусть GC сделает свою работу.
На странице, посвященной проблеме ABA, также представлена реализация стека без блокировки, который фактически работает в .Net (& Java) с узлом (GC-ed), содержащим элементы.)
Редактировать :
@Neil:
на самом деле то, что вы упомянули о Фортране, напомнило мне, что аналогичные виды связанных списков можно найти, вероятно, в наиболее используемой и злоупотребляемой структуре данных в .NET:
простой .NET универсальный Dictionary<TKey, TValue>
.
Не один, а много связанных списков хранятся в массиве.
- Это позволяет избежать множества небольших (де) выделений при вставке / удалении.
- Первоначальная загрузка хеш-таблицы происходит довольно быстро, поскольку массив заполняется последовательно (очень хорошо работает с кешем ЦП).
- Не говоря уже о том, что цепочка хеш-таблиц является дорогой с точки зрения памяти - и этот "трюк" сокращает "размеры указателя" пополам на x64.
По сути, многие связанные списки хранятся в массиве. (по одному на каждое использованное ведро.)
Свободный список многократно используемых узлов «переплетается» между ними (если они были удалены).
Массив выделяется при запуске / перефразировке, и в нем сохраняются узлы цепочек. Также имеется указатель free - индекс в массиве - который следует за удалением. ;-) Так что - хотите верьте, хотите нет - техника FORTRAN все еще живет. (... и нигде больше, чем в одной из наиболее часто используемых структур данных .NET; -).