Вот типичный шаблон, который вы можете использовать для блокировки. По сути, вы можете создать блокирующий объект, который используется для блокировки доступа к вашему критическому разделу (который, как сказал @Hans, не защищает объект, над которым вы работаете - он просто обрабатывает блокировку).
class ThreadSafe
{
static readonly object _locker = new object();
static int _val1, _val2;
static void Go()
{
lock (_locker)
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
}
}
Этот пример взят из онлайновой книги Джозефа Албахари о потоках. Он предоставляет превосходный обзор того, что происходит, когда вы создаете оператор lock
, и некоторые советы / рекомендации о том, как лучше всего его оптимизировать. Определенно настоятельно рекомендуется к прочтению.
За Албахари, опять же, оператор lock
переводит в .NET 4 как:
bool lockTaken = false;
try
{
Monitor.Enter (_locker, ref lockTaken);
// Do your stuff...
}
finally { if (lockTaken) Monitor.Exit (_locker); }
На самом деле это безопаснее, чем прямой Monitor.Enter
, а затем вызывать Monitor.Exit
в вашем finally
, поэтому он был добавлен в .NET 4.