С#:Нужно ли синхронизировать ArrayList, если его только читают несколько потоков?

StackOverflow https://stackoverflow.com/questions/1819968

Вопрос

Я использую статический ArrayList в классе для хранения информации о необновляемых полях базы данных.Я планирую инициализировать его в конструкторе один раз (вызов метода инициализации защищен блокировкой в ​​конструкторе).После этого несколько потоков проверяют, содержит ли arraylist поле.Должен ли я каким-либо образом контролировать этот доступ для чтения?Например, вызвав ArrayList.Synchronized.

Это было полезно?

Решение

Нет (и вам не нужно этого делать при его создании, если вы делаете это в static конструктор, который имеет неявную многопоточную блокировку - если вы не в состоянии сделать это, вы, вероятно, захотите заблокировать).Однако есть ReaderWriterLockSlim, который вы можете использовать для управления доступом, если вам в конечном итоге понадобится доступ к R/W.

Другие советы

Нет.Синхронизация требуется только для объектов с состоянием, состояние которых вы собираетесь изменить.

Нет, пока вы читаете, вы можете просто заниматься этим.

Нет, но подумайте о том, чтобы обернуть его в ReadOnlyCollection чтобы убедиться, что ни один из потоков не сможет его изменить.

Редактировать:Однако для этого вам нужно сделать список List<T> а не ArrayList.

Для первоначального создания вашего списка вы можете рассмотреть возможность использования статического конструктора.Это будет вызываться только один раз при первой ссылке на тип.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top