Скажем, у меня есть свойство, чей установщик защищен блокировкой, но без какой-либо блокировки вокруг получателя, например
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
.
Q: А теперь гарантированно A видит новое значение?Или наша блокировка просто гарантирует, что B своевременно записывает в основную память, а другие потоки не читают новое значение?Или же ответ может зависеть от того, работаем ли мы в .Net 2+ или в «более слабой» реализации ECMA?