Потокобезопасность - это гораздо больше, чем просто «это повредит структуру данных».
В контексте настроек необходимо учитывать три различных значения. Структура данных настроек безопасна в одном из них, но не в двух других.
- Установка и считывание отдельных значений
- Установка и считывание нескольких значений одновременно, получение или установка согласованного изображения
- Корректировка значения с использованием его текущего значения для расчета нового перед его восстановлением
В первом случае, да, структура данных настроек является поточно-ориентированной. Вы не сможете записать половину Int64 в настройки и рискнуть, что другой поток соблюдает это половинное значение.
Однако, если вы устанавливаете несколько значений последовательно, вам не гарантируется, что другой поток не сможет прочитать все настройки между двумя такими операторами набора, наблюдая одно изменение, но не другое.
Другими словами, у вас может быть такой сценарий:
Thread 1 Thread 2
set setting 1
read setting 1
read setting 2
set setting 2
А в случае чтения значения, вычисления нового значения из прочитанного вами значения и его установки обратно, нет никакой гарантии, что другой поток не сможет сделать то же самое (т. Е. Изменить текущее значение) тем временем.
Как это:
Thread 1 Thread 2
read setting 1
read setting 1
calculate new value
write setting 1
calculate new value
write setting 1
Для последних двух сценариев вам необходим внешний объект синхронизации, который вы можете заблокировать, чтобы гарантировать, что вы не получаете изменения на полпути или не теряете изменения, но тогда весь код, обращающийся к настройкам таким образом, должен будет блокироваться этот объект.