我想lock一个Boolean变量时,我遇到了以下错误:
'bool'不是lock语句所要求的引用类型
似乎在lock语句中只允许引用类型,但我不确定我理解为什么.
安德烈亚斯在评论中说:
当[值类型]对象从一个线程传递到另一个线程时,会生成一个副本,因此线程最终会处理2个不同的对象,这是安全的.
这是真的吗?这是否意味着当我执行以下操作时,我实际上在修改和方法x中的两个不同?xToTruexToFalse
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;
}
}
Run Code Online (Sandbox Code Playgroud)
(仅此代码在其状态下显然无用,仅用于示例)
PS:我知道关于如何正确锁定值类型的这个问题.我的问题与如何但与原因无关.
在阅读了Jon Skeet 文章 和msdn的这篇文章后,我仍然有一个问题
假设我有这段代码:
MyPerson mp = new MyPerson(); //Field
int g=0; //Field
public void DoWork ()
{
int i;
MyPerson mp2 = new MyPerson();
...
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说我有两个主题.哪个运行DoWork.(现在让我们忽略,竞争条件)
他们是否会看到相同g或每个线程都有自己的项目??(价值)
他们都会看到相同mp 或每个线程都有自己的项目?? (实例)
他们是否会看到相同i或每个线程都有自己的项目?(价值)
他们是否会看到相同mp2或每个线程都有自己的项目?(实例)
如果他们都看到相同,我为什么需要static?
我搜索了很多关于这个主题的内容,但找不到任何文章说明:不同的主题,参考类型和价值类型...)
根据Eric Gunnerson的说法
别
Do锁定私有变量,而不是用户可以看到的内容如果需要私钥锁定,请使用"object key = new object()"
是什么原因??