Является ли оценка оператора switch потокобезопасной?

Рассмотрим следующий пример кода:

class MyClass
{
    public long x;

    public void DoWork()
    {
        switch (x)
        {
            case 0xFF00000000L:
                // do whatever...
                break;

            case 0xFFL:
                // do whatever...
                break;

            default:
                //notify that something going wrong
                throw new Exception();
        }
    }
}

Забудьте о бесполезности фрагмента: я сомневаюсь в поведении оператор switch .

Предположим, что поле x может иметь только два значения: 0xFF00000000L или 0xFFL . Вышеупомянутый переключатель не должен попадать в параметр «по умолчанию».

Теперь представьте, что один поток выполняет переключатель с «x», равным 0xFFL, поэтому первое условие не будет соответствовать. В то же время другой поток изменяет переменную «x» на 0xFF00000000L. Мы знаем, что 64-битная операция не является атомарной, поэтому у переменной сначала будет обнулено нижнее двойное слово, а затем будет установлено верхнее (или наоборот).

Если второе условие в переключателе будет выполнено, когда " x "равен нулю (т.е. во время нового присвоения), попадем ли мы в нежелательный случай" по умолчанию "?

25
задан VMAtm 5 August 2011 в 08:00
поделиться