2009-08-14 2 views
1

Я хочу иметь общую коллекцию потоковой безопасности, и я увидел, что Arraylist можно легко использовать потокобезопасность по его статическому синхронному методу, но что меня беспокоит, что этот ArrayList не является общим, поэтому, когда я хочу использовать свои объекты, у меня всегда есть чтобы бросить их. Есть ли более простой способ сделать это? Также возможны другие типы списков.Threadsafe и общий arraylist?

+0

и да, я мог бы обернуть ArrayList, возможно, любыми другими решениями? :) –

ответ

3

Немного знаний опасная вещь ;-) Да, вы могли бы использовать предложение Meta-Knight и использовать SyncRoot, но вам нужно быть осторожным - это не панацея. См. this post из блога Team BCL от Microsoft, чтобы понять, почему это не так просто, как SyncRoot. Цитаты из этого поста:

Несколько проницательных пользователей наших общих коллекций заметили, что мы больше не обеспечить общественную SyncRoot собственности на ICollection<T>

и

Я не думаю, что мы «Лучше заставлять людей больше думать о синхронизации , и, честно говоря, SyncRoot Недвижимость на нашем общем собрании не дает никакой ценности.

Конечно, это не означает, что его нельзя использовать ни при каких обстоятельствах - вам просто нужно тщательно подумать о случаях использования и не быть на автопилоте.

3

Если вы читали на MSDN относительно синхронизированного метода до сих пор говорит, что это:

«Перечислив через коллекцию внутренне не процедура потокобезопасной Даже если коллекция синхронизирована, другие потоки могут по-прежнему изменять коллекцию. , что заставляет перечислитель вызывать исключение. Чтобы гарантировать безопасность потока во время перечисления, вы можете заблокировать сбор во время всего перечисления или уловить исключения, возникающие в результате изменений, сделанных другими потоками ».

3

Вы можете создать обертку List (T) и синхронизировать доступ с свойством SyncRoot.

MSDN пример:

ICollection ic = ...; 
lock (ic.SyncRoot) 
{ 
    // Access the collection. 
} 
Смежные вопросы