假设我有一个属性,其设置器受锁保护,但在 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 实现中运行?