ManagetLinkCollection
Репозиторий: git repo
Данный проект реализует 2 коллекции.
Коллекцию представляют из себя Key Value хранилище, являются потокобезопасными. (В основе лежит ConcurrentDictionary)
Для обеспечения оптимистичной блокировки в LinkStorage используется специальный item с полем Stamp, по которому проверяется не был ли изменен элемент во время операции.
(Подробнее смотри ConcurrentDictionary)
1) LinkStorage
Интерфейс:
AddLink
TKey key - ключ
Func<TKey, TData> addFactory - фабрика для нового значения
Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения
Если по ключу нет записи, то
добавить запись
счетчик записи = 1
вызвать addFactory(если не null) и заполнить value.Data
Иначе если по ключу есть запись, то
Увеличить счетчик на 1
вызвать updateFactory(если не null) и обновить value.Data
RemoveLink
TKey key - ключ
Func<ILinkItem<TKey, TData>, TData> updateFactory - фабрика для обновления существующего значения
Уменьшить счетчик на 1
вызвать updateFactory(если не null) и обновить value.Data
Если значение счетчика <= 0
То удалить запись
2) ObjectLinkStorage
Данная коллекция оборачивает LinkStorage, добавляя к контракту сущность объекта, ссылающегося на запись.
Все объекты, ссылающиеся на запись храняться в ImmutableHashSet.
При AddLink, помимо увеличения счетчика в HashSet записи добавляется ссылающийся объект.
При RemoveLink, помимо уменьшения счетчика из HashSet удаляется ссылающийся объект.
Ссылки:
Разработка/NET/C#/ConcurrentDictionary
https://stackoverflow.com/questions/39679779/how-to-achieve-remove-if-functionality-in-net-concurrentdictionary