Если переменная типа Int (целое число) является по своей сути атомное в Java согласно выдержке Effective Java в ниже, то почему мы видим противоречивое состояние целого значения в примере: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.htmlJava атомная функция против Эффективное Java выдержке
Спецификация языка гарантирует, что чтение или запись переменной атома, если переменная имеет тип long или double [JLS, 17.4.7]. Другими словами, , читающий переменную, отличную от длинной или двойной, гарантированно возвращает значение, которое было записано в эту переменную некоторым потоком, даже если несколько потоков изменяют переменную одновременно и без синхронизации.
Вышеуказанные пункты противоречат мне.
Я думаю, что я получил лучшее понимание после прочтения ваших ответов: int is atomic, означает, что операция чтения битов целочисленной переменной является атомарной, правильно? так записывает биты обратно в целочисленную переменную. Однако после того, как я прочитал биты, выполнение приращений или декрементов вызовет противоречивые представления, поскольку многие потоки могут выполняться в разное время процессора. Правильно? –
Да, каждое отдельное чтение или запись является атомарным, но приращение и декремент не являются атомарными. Поток может прервать другой поток, который только что прочитал его значение, выполнив его изменение, но когда исходный поток завершит свою работу, изменение прерывистого потока будет потеряно без внешней синхронизации. – rgettman