Возможно, вы захотите прочитать о SyncLock и SyncRoot, которые используются для создания общей схемы блокировки ваших объектов. Поскольку вы не хотите блокировать объект enitre, у вас часто есть SyncRoot, который вы заблокировали.
Примером этого является ArrayList или ICollection, которые оба имеют SyncRoot, который вы должны использовать для блокировки коллекции. Вы можете прочитать больше о Thread Synchronization на MSDN .
Но, как правило, Марк указал, будь осторожен, тестируй, тестируй, тестируй и делай еще тесты!
Пример SyncLock
public class Person
{
public decimal Salary { get;set; }
public string Name { get; set; }
public readonly object SyncRoot = new object();
}
Затем вы можете подойти к замку так:
var person = new Person { Name = "Bill", Salary = 1000000 };
lock(person.SyncRoot)
{
IncreasSalary();
}
A плохой паттерн должен сделать lock(this)
НИКОГДА сделать это!
Существует также нечто, называемое Двойная проверка блокировки , которая не относится к .NET. Вы также можете прочитать эту статью по «Стратегическая блокировка, Потокобезопасный интерфейс и Блокировка по объему» .
Тестирование безопасности резьбы
Если вы хотите проверить безопасность потока, я рекомендую проверить «Модульное тестирование безопасности потока» , принятый ответ указывает на Microsoft Chess , который может помочь вам определить тупики в ваше заявление.