Прежде всего, присваивание всем примитивным типам (кроме 64-битных) в Java является атомарным в соответствии со спецификацией Java. Но, например, автоинкремент не является потокобезопасным, независимо от того, какой тип вы используете.
Но настоящая проблема с этим кодом - не атомарность, а видимость. Если два потока изменяют value
, они могут не видеть изменения, сделанные друг другом. Используйте ключевое слово volatile
или, что еще лучше, AtomicInteger
, чтобы гарантировать правильную синхронизацию и видимость.
Обратите внимание, что ключевое слово synchronized
также гарантирует видимость, что означает, что если в блоке synchronnized
произойдет какая-либо модификация, гарантируется, что оно будет видно другим потокам.