【发布时间】:2008-12-27 18:13:00
【问题描述】:
我正在阅读以下文章: http://msdn.microsoft.com/en-us/magazine/cc817398.aspx “解决多线程代码中的 11 个可能问题”,作者:Joe Duffy
它向我提出了一个问题: “在多线程代码中读取 .NET Int32 时,我们需要锁定它吗?”
我知道如果它是 32 位 SO 中的 Int64,它可能会撕裂,正如文章中所解释的那样。但是对于 Int32,我想象了以下情况:
class Test
{
private int example = 0;
private Object thisLock = new Object();
public void Add(int another)
{
lock(thisLock)
{
example += another;
}
}
public int Read()
{
return example;
}
}
我认为没有理由在 Read 方法中包含锁。你呢?
更新根据答案(由 Jon Skeet 和 ctacke 提供),我知道上面的代码仍然容易受到多处理器缓存的影响(每个处理器都有自己的缓存,与其他处理器不同步)。下面的所有三个修改都解决了这个问题:
- 在“int example”中添加“volatile”属性
- 插入 Thread.MemoryBarrier();在实际阅读“int example”之前
- 在“lock(thisLock)”中读取“int example”
而且我也认为“volatile”是最优雅的解决方案。
【问题讨论】:
标签: c# .net multithreading locking