Другие ответы на вопросы, почему требуется AtomicInteger
. Я хотел бы уточнить, о чем говорит этот документ.
Использование термина атома в этом документе не с той же целью, как и его использование в AtomicInteger
.
Этот документ также утверждает
Атомные действия не могут чередоваться, поэтому они могут быть использованы без страха резьбы вмешательства.
Это относится к
int x;
x = 1; // thread 1
x = 2; // thread 2
System.out.println(x); // thread 3
thread 3
гарантированно увидеть либо значение 1
или значение 2
.
Однако, с long
или double
, у вас нет этой гарантии. Java Language Specification заявляет
Для целей модели памяти языка программирования Java, а одного записи в энергонезависимую long
или double
значения рассматриваются как два отдельных пишут: один к каждому 32-битной половине. Это может привести к ситуации , когда поток видит первые 32 бита 64-битного значения от , один напишет, а второй 32 бита из другой записи.
Так, например,
long x;
x = 0xffff_ffffL; // thread 1
x = 0x7fff_ffff_0000_0000L; // thread 2
System.out.println(x); // thread 3
thread 3
допускается, чтобы увидеть первый 32 бита из thread 1
'присвоения ей и последние 32 бит из thread 2
' присвоения ей, создавая значение 7fff_ffff_ffff_ffff
long
. То же самое может произойти для double
.
Изменение этой переменной long
или double
с volatile
предотвращает это поведение.
Атомарность записей практически не имеет отношения к использованию «AtomicInteger». Например. 'compareAndSet' по-прежнему очень важен и не имеет ничего общего с атомарностью его записей. – luk2302
Все примитивы, кроме 'long' и' double', всегда были атомарными для чтения и записи. Это не изменилось для 'int'. –
Что делать, если атомичность - это еще не все, что вам нужно? Что делать, если вам нужны, например, гарантии на видимость? –