Часто, когда я хочу класс, который является потокобезопасным, я делаю что-то вроде следующего:
public class ThreadSafeClass
{
private readonly object theLock = new object();
private double propertyA;
public double PropertyA
{
get
{
lock (theLock)
{
return propertyA;
}
}
set
{
lock (theLock)
{
propertyA = value;
}
}
}
private double propertyB;
public double PropertyB
{
get
{
lock (theLock)
{
return propertyB;
}
}
set
{
lock (theLock)
{
propertyB = value;
}
}
}
public void SomeMethod()
{
lock (theLock)
{
PropertyA = 2.0 * PropertyB;
}
}
}
Это работает, но очень многословно. Иногда я даже создаю объект блокировки для каждого метода и свойства, создавая больше деталей и сложности.
Я знаю, что также возможно блокировать классы, используя атрибут Synchronization, но я не уверен, насколько хорошо это масштабируется - поскольку я часто ожидаю иметь сотни тысяч, если не миллионы, экземпляров поточно-безопасных объектов , Этот подход создаст контекст синхронизации для каждого экземпляра класса и требует, чтобы класс был производным от ContextBoundObject и, следовательно, не мог быть получен из чего-либо еще - поскольку C # не допускает множественного наследования - что является ограничителем показа во многих случаях.
Редактировать: Как подчеркивали некоторые респонденты, не существует "серебряной пули", ориентированной на многопотоковое исполнение. Я просто пытаюсь понять, является ли шаблон, который я использую, одним из хороших решений. Конечно, лучшее решение в любой конкретной ситуации зависит от проблемы. Некоторые из ответов ниже содержат альтернативные варианты, которые следует учитывать.
Редактировать: Более того, существует более одного определения безопасности потока. Например, в моей реализации выше, следующий код НЕ будет потокобезопасным:
var myObject = new ThreadSafeClass();
myObject.PropertyA++; // NOT thread-safe
Итак, приведенное выше определение класса представляет собой хороший подход? Если нет, что бы вы порекомендовали для дизайна с аналогичным поведением, которое было бы поточно-ориентированным для аналогичного набора применений?