С#:Нужно ли синхронизировать ArrayList, если его только читают несколько потоков?
-
10-07-2019 - |
Вопрос
Я использую статический ArrayList в классе для хранения информации о необновляемых полях базы данных.Я планирую инициализировать его в конструкторе один раз (вызов метода инициализации защищен блокировкой в конструкторе).После этого несколько потоков проверяют, содержит ли arraylist поле.Должен ли я каким-либо образом контролировать этот доступ для чтения?Например, вызвав ArrayList.Synchronized.
Решение
Нет (и вам не нужно этого делать при его создании, если вы делаете это в static
конструктор, который имеет неявную многопоточную блокировку - если вы не в состоянии сделать это, вы, вероятно, захотите заблокировать).Однако есть ReaderWriterLockSlim, который вы можете использовать для управления доступом, если вам в конечном итоге понадобится доступ к R/W.
Другие советы
Нет.Синхронизация требуется только для объектов с состоянием, состояние которых вы собираетесь изменить.
Нет, пока вы читаете, вы можете просто заниматься этим.
Нет, но подумайте о том, чтобы обернуть его в ReadOnlyCollection
чтобы убедиться, что ни один из потоков не сможет его изменить.
Редактировать:Однако для этого вам нужно сделать список List<T>
а не ArrayList
.
Для первоначального создания вашего списка вы можете рассмотреть возможность использования статического конструктора.Это будет вызываться только один раз при первой ссылке на тип.