Несколько потоков вызывают те же функцию объектов одновременно. Может ли это вызвать проблемы?

Предположим, у меня есть следующий класс 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 , это произойдет. Следовательно, блокировка построить для этого. Но я не уверен, нужно ли мне делать блокировку для локальных переменных.

6
задан Amith George 3 September 2011 в 15:37
поделиться