我仍然有点不清楚什么时候在一些代码周围加锁。我的一般经验法则是在读取或写入静态变量时将操作包装在锁中。但是当一个静态变量只被读取时(例如,它是在类型初始化期间设置的只读),访问它不需要包含在锁定语句中,对吗?我最近看到一些类似于以下示例的代码,这让我觉得我的多线程知识可能存在一些差距:
class Foo
{
private static readonly string bar = "O_o";
private bool TrySomething()
{
string bar;
lock(Foo.objectToLockOn)
{
bar = Foo.bar;
}
// Do something with bar
}
}
这对我来说没有意义——为什么会出现读取寄存器的并发问题?
此外,这个例子提出了另一个问题。其中一个比另一个更好吗?(例如,两个持有锁的时间更短?)我想我可以拆卸 MSIL ......
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
lock(Foo.objectToLockOn)
{
return Foo.joke;
}
}
}
对比
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
string joke;
lock(Foo.objectToLockOn)
{
joke = Foo.joke;
}
return joke;
}
}