Предположим, у меня есть следующий класс C #
class MyClass
{
private int _i;
private object _locker = new object();
public void DoSomething()
{
var b = 2;
// some work that depends on b being 2
lock(_locker)
{
_i = 3;
}
// some more work
b = -1;
// some more work
}
}
, и я использую его таким образом,
//Usage:
var myobject = new MyClass();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
может произойти следующая последовательность?
Thread 1 is halfway through its work.
Thread 2 just starts. Sets b = 2.
Thread 1 sets b = -1.
Thread 2 is confused because it expected b to be 2 but its -1.
Важный момент состоит в том, что b
- локальная переменная. Будут ли два потока получить доступ к тому же экземпляру B? Я понимаю, что для переменной экземпляра _i
, это произойдет. Следовательно, блокировка
построить для этого. Но я не уверен, нужно ли мне делать блокировку для локальных переменных.