我试图lock
一个Boolean
变量时,我遇到了以下错误:为什么我们不能锁定值类型?
“布尔”不是所要求的lock语句引用类型
似乎只有引用类型允许在lock
声明,但我不知道我明白为什么。
安德烈亚斯是说明在他comment:
当[值类型]对象从一个线程传递到其他,复制制成,这样的螺纹最终在2个不同的对象,工作这是安全的。
这是真的吗?这是否意味着当我执行以下操作时,实际上我正在修改xToTrue
和xToFalse
方法中的两个不同的x
?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(仅此代码是在其状态显然没用,那是只为例子)
P.S:我知道在How to properly lock a value type这个问题。我的问题不是怎么而是为什么。
您的程序没有在它使用共享副本的线程之间传递x。但是它仍然不是线程安全的,因为您不在锁的范围内访问x,并且x没有声明为volatile。我感到另一个问题:“为什么在这个例子中x需要变化?” –
@MartinBrown:我知道,在我的* real *代码中,我对专用对象使用了一个锁(正如我在我的问题中提到的,它与* why *而不是* how *有关)。至于'volatile',它[在正确锁定时不需要](http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-部分three.aspx)。 – Otiel