Недавно я читал учебник, в котором я наткнулся на утверждение, что говорит ..атомарных операций и многопоточности
«Спецификация языка гарантирует Java, что чтение или запись переменной является атомарной операцией (если переменная не является типа long
или double
). Операционные переменные типа long
или double
являются только атомарными, если они объявлены с помощью ключевого слова volatile
. "
AtomicInteger
или AtomicLong
, который предоставляет методы, такие как getAndDecrement()
, getAndIncrement()
и getAndSet()
, которые являются атомарными.
я запутался немного с вышеуказанным заявлением .. и не могли бы вы уточнить когда использоватьAtomicInteger
или AtomicLong
классы.
Тогда почему мы должны использовать «volatile», если мы выполняем операции с переменными типа «double» или «long»? – MaheshVarma
Если вы используете AtomicXxx, вам не нужно использовать volatile, поскольку атомные объекты предоставляют больше гарантий, чем летучие. Выполнение 'a ++' в энергонезависимом целой не делает операцию атомой. Это гарантирует, что другой поток увидит новое значение a после его увеличения. При назначении новых значений длинным или двойным значениям также гарантируется, что запись является атомарной операцией (поскольку запись в энергонезависимую длинную или двойную переменную заключается в записи 4 байтов, а затем запись других 4 байтов). Предпочитают атомарные объекты над изменчивыми переменными в целом. –
'a = 28' не гарантированно является атомарным, если' a' является длинным или двойным, если оно не является также изменчивым. – assylias