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