Рассмотрим следующий пример кода:
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 "равен нулю (т.е. во время нового присвоения), попадем ли мы в нежелательный случай" по умолчанию "?