假设我有以下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
,这将会发生。因此lock
构造了它。但我不确定是否需要锁定局部变量。
答案 0 :(得分:11)
当调用者输入方法DoSomething()
时,局部变量将被置于堆栈中。每个线程在一个单独的堆栈上运行,并将获得自己唯一的局部变量。
Wikipedia for thread local storage的这一部分也适用于C#线程:
换句话说,静态或全局变量中的数据通常是总是 位于相同的内存位置,由线程引用 同样的过程。然而,堆栈上的变量是线程的本地变量, 因为每个线程都有自己的堆栈,驻留在不同的内存中 位置。