В дополнение к очень полезным классам в System.Collections.Concurrent
, одна стандартная методика в сценариях «в основном читают редко меняются» (или, если есть, однако, частые, но не одновременные записи), которая также применима к .Netс именем Копирование при записи .
Имеет несколько свойств, которые желательны в высококонкурентных программах:
- collectionСами экземпляры объектов являются неизменяемыми (т. е. потокобезопасными, их можно безопасно перечислить без блокировки).
- Модификация может занимать столько времени, сколько необходимо, производительность и параллелизм чтения не затрагиваются
- реализован в общем случае , чтобы превратить любую структуру данных, которая не является поточно-ориентированной, в структуру, которая является
Ограничение: при одновременных записях модификации, возможно, придется повторить, поэтому чем большеодновременные записи получают, тем менее эффективными они становятся.(Это оптимистичный параллелизм в работе)
Редактировать Комментарий Скотта Чемберлена напомнил мне, что есть еще одно ограничение: если ваши структуры данных огромны, и изменения происходят часто, копия-все-при-записи может быть непомерно как с точки зрения потребления памяти, так и с точки зрения затрат на копирование ЦП.