C #: нужно ли синхронизировать ArrayList, если несколько потоков только читают его - PullRequest
1 голос
/ 30 ноября 2009

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

Ответы [ 5 ]

3 голосов
/ 30 ноября 2009

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

3 голосов
/ 30 ноября 2009

Нет, до тех пор, пока вы читаете, вы можете просто читать.

2 голосов
/ 30 ноября 2009

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

1 голос
/ 30 ноября 2009

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

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

0 голосов
/ 30 ноября 2009

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

...