Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, mihailik, Вы писали:
M>>Ещё немного из свежего блога:
M>>volatile and MemoryBarrier() Brad Adams Blog
S> Спасибо. Нужно будет попобовать.
По указанной ссылке написано:
public static Singleton Value {
get {
if (Singleton.value == null) {
lock (syncRoot) {
if (Singleton.value == null) {
Singleton newVal = new Singleton();
// Insure all writes used to construct new value have been flushed.
System.Threading.Thread.MemoryBarrier();
Singleton.value = newVal; // publish the new value
}
}
}
return Singleton.value;
}
}
Почему System.Threading.Thread.MemoryBarrier();
Выполняется до Singleton.value = newVal;
а не после него, если мы боимся, что к моменту выполнения
другим потоком (lock (syncRoot) { if (Singleton.value == null) ...)
Singleton.value еще не будет еще присвоено?
Не логичнее ли высвободить кэш после присвоения?
... << RSDN@Home 1.1.3 beta 2 >>