Это не сбой , но это может дать неправильные результаты.
Для блокировки необходимо убедиться, что каждый доступ защищен с помощью оператора блокировки на том же мониторе:
private readonly object monitor = new object();
private int sharedVariable;
public void MethodThatSetsVariable()
{
lock (monitor)
{
sharedVariable = 5;
}
}
public void MethodThatReadsVariable()
{
int foo;
lock (monitor)
{
foo = sharedVariable;
}
// Use foo now
}
Альтернативы:
- Используйте переменную
volatile
, хотя точное поведение volatile
трудно понять.(Ну, в любом случае, это вне меня.) - Используйте методы класса
Interlocked
Обратите внимание, что оба они лучше всего подходят, когда вы используете только одну общую переменную 'Вы заинтересованы в этом. Когда вам нужно получить доступ к набору переменных и убедиться, что вы видите только полностью согласованное состояние, блокировки - это самый простой способ.
Другой вариант - и предпочтительнее, если это вообще возможно.- в первую очередь избегать необходимости изменяемого общего состояния.Это не всегда возможно, по крайней мере, без полной модернизации архитектуры передачи сообщений - но это стоит того, чтобы по возможности.Неизменяемые типы могут помочь в достижении этой цели.