【发布时间】:2011-03-06 05:35:45
【问题描述】:
假设我有一个属性,其 setter 受锁保护,但 getter 周围没有任何锁,例如
private long _myField;
public long MyProperty
{
get { return _myField; }
set { lock(whatever) _myField = value; }
}
除了同步写入(而不是读取)之外,锁定,或者更确切地说 Monitor.Exit,应该会导致 volatile write。现在假设我们有两个线程 A 和 B,会发生以下序列:
- A 读取
MyProperty的当前值。 - B 将新值写入
MyProperty。 - A 再次读取
MyProperty的当前值。
问:A 现在可以保证看到新值了吗?还是我们的锁只是确保 B 及时写入主内存,而不是其他线程读取新值?或者答案甚至取决于我们是在 .Net 2+ 还是“较弱”的 ECMA 实现中运行?
【问题讨论】:
标签: c# .net concurrency locking memory-model