Статический словарь в .Net Потокобезопасность

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Чтение документация MSDN для словарей написано:«Публичные статические (общие в Visual Basic) члены этого типа являются потокобезопасными.Потокобезопасность любых членов экземпляра не гарантируется».

Это означает, что с таким словарем:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

Делать что-то вроде кода ниже ненужно?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}
Это было полезно?

Решение

Это относится к статическим методам самого класса.Это утверждение на самом деле представляет собой шаблонную документацию, добавленную к большинству классов.Класс Dictionary<> фактически не предоставляет никаких статических методов.

Вам придется самостоятельно сериализовать доступ к классу словаря, используя ключевое слово lock или, возможно, даже ReaderWriterLock.Однако потоковая обработка — довольно сложная тема, и ключевое слово lock не всегда подходит.Есть замечательная книга Джо Даффи"Параллельное программирование в Windows", в котором очень подробно рассматривается защита общих ресурсов приложений.

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

Вы неверно истолковываете «публичную статику». члены этого типа» как «публичный статический случаи этого типа».

Это означает, что если вы вызываете метод Add (метод экземпляра), вам лучше убедиться, что у вас есть монопольный доступ к словарю, используя собственную семантику блокировки или сериализации.Плохие вещи могут произойти, если два потока одновременно изменяют состояние вашего словаря, и вы несете ответственность за то, чтобы этого не произошло.В методе Add словаря нет ничего, что могло бы выполнить эту блокировку за вас.

Однако если вы вызовете какой-нибудь статический метод в Dictionary (из которого нет полезных), то все будет в порядке и без блокировки.

Это общее правило для всех типов .NET в BCL.

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