Мой совет: если вы делаете многопоточное программирование, начните с синхронизации как можно скорее. Atomicity работает для небольших типов данных, но как только вы захотите получить доступ к экземплярам классов из разных потоков, вам нужно подумать о синхронизации, либо используя , либо явно манипулируя блокировками.
Хотя одиночные int
чтения и записи являются атомарными в том смысле, что они не оставят переменную в несогласованном состоянии, это не единственное, что важно для атомарности. В частности, современные процессоры переупорядочивают инструкции и кэш-память, так что изменения в переменной могут быть недоступны для других потоков (это можно решить, добавив ключевое слово volatile
к переменной.
Кроме того, AtomicInteger
и друзья также предоставляют операции, которые состоят из нескольких операций, например, метода getAndIncrement()
, который аналогичен оператору postfix ++
.Это состоит из чтения и записи, а если вы не синхронизируете или не используете AtomicInteger
, другие потоки могут получить доступ к переменной между чтение и запись.
Я не думаю, что есть способ. Фактическая установка примитива - это одна операция в любом случае (уже атомарная). Если вы произвольно решаете, что какой-то целый метод должен быть атомарным, вам придется его синхронизировать. Я думаю, что атомные классы действительно предоставляются только для удобства, потому что такие вещи, как увеличение числа, являются общими. – Richard