Вот мой вклад в коллективное понимание этого поведения ... Это немного, просто демонстрация (на основе демонстрации xkip), которая показывает поведение изменчивого стиха с энергонезависимым (то есть "нормальным") значением int, бок о бок -в той же программе ... это то, что я искал, когда нашел эту ветку.
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
Выше есть несколько действительно отличных кратких объяснений, а также несколько отличных ссылок. Спасибо всем за то, что помогли мне volatileсориентироваться (по крайней мере, достаточно, чтобы не полагаться на то, volatileгде был мой первый инстинкт lock).
Ура и спасибо за ВСЮ рыбу. Кит.
PS: Я бы очень заинтересован в демо исходном запросе, который был: «Я хотел бы видеть в статический летучий Int ведет себя правильно , где это статический Int ведет себя плохо.
Я пробовал и не смог решить эту задачу. (На самом деле я довольно быстро сдался ;-). Во всем, что я пробовал со статическими варами, они ведут себя «правильно» независимо от того, изменчивы они или нет ... и мне бы хотелось получить объяснение, ПОЧЕМУ это так, если это действительно так ... компилятор не кэширует значения статических переменных в регистрах (т.е. вместо этого кэширует ссылку на этот адрес кучи)?
Нет, это не новый вопрос ... это попытка вернуть сообщество к исходному вопросу.