【发布时间】:2010-09-11 10:28:38
【问题描述】:
我仍然有点不清楚什么时候在一些代码周围加上一个锁。我的一般经验法则是在读取或写入静态变量时将操作包装在锁中。但是当一个静态变量只被读取时(例如,它是在类型初始化期间设置的只读),访问它不需要包装在锁语句中,对吧?最近看到一些类似下面例子的代码,让我觉得自己的多线程知识可能有些差距:
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;
}
}
【问题讨论】:
标签: c# multithreading concurrency synchronization