假设我有一个属性,其setter受锁的保护,但没有锁定getter,例如。
private long _myField;
public long MyProperty
{
get { return _myField; }
set { lock(whatever) _myField = value; }
}
除了同步写入(但不是读取)之外,锁定,或者更确切地说是Monitor.Exit,应该导致volatile write。我们现在说我们有两个线程A和B,并且发生以下序列:
MyProperty
的当前值。MyProperty
。MyProperty
的当前值。答案 0 :(得分:3)
不,由于读取没有明确的内存屏障,因此无法“保证”看到新值。
您可以使用ReaderWriterLockSlim
来确保a)写入相互锁定,以及b)读取始终拾取新值。
private readonly ReaderWriterLockSlim _myFieldLock = new ReaderWriterLockSlim();
private long _myField;
public long MyProperty
{
get
{
_myFieldLock.EnterReadLock();
try
{
return _myField;
}
finally
{
_myFieldLock.ExitReadLock();
}
}
set
{
_myFieldLock.EnterWriteLock();
try
{
_myField = value;
}
finally
{
_myFieldLock.ExitWriteLock();
}
}
}
答案 1 :(得分:1)
如果您在getter中使用Interlocked.Read,则应始终读取新值。有关内存栅栏的详细信息,请参阅Threading in C#