Метод compareAndSet означает «Обновить переменную этим новым значением, но отказать, если другой поток изменил значение после моего последнего просмотра».
уменьшение, обновление или добавление значения, потокобезопасным способом.
Атомарные классы гарантируют выполнение определенных операций, таких как увеличение и
Поэтому если один поток изменит значение переменной, то другой поток может не увидеть это изменение, так как будет считывать значение из своего кэша. Это и будет ошибкой согласованности памяти
Если переменная объявлена как volatile, это означает, что она может изменяться разными потоками.
Это гарантирует, что изменения состояния объекта будут видны для всех потоков.
Синхронизация необходима для взаимоисключающего доступа к блокам и для надежной связи между потоками.
Среда выполнения JRE неявно обеспечивает синхронизацию при доступе к volatile-переменным, но с очень большой оговоркой: чтение volatile-переменной и запись в volatile-переменную синхронизированы, а неатомарные операции, такие как операция инкремента или декремента ― нет.
Атомарные действия не могут перемешиваться, поэтому их можно использовать, не опасаясь интерференции потоков.
Но есть действия, которые являются атомарными:
Это чтение и запись всех переменных, ссылочных на объекты и примитивных переменных, за исключением переменных типа long и double.
Так как в Java 64-битные long и double значения рассматриваются как два 32-битных значения.
Это означает, что 64-разрядная операция записи выполняется как две отдельные 32-разрядные операции.
И это значит, что действия с long и double переменными не являются потокобезопасными.
Когда вызывается статический синхронизированный метод, так как статический метод связан с классом, а не с объектом, в этом случае поток получает блокировку для объекта Class, связанного с классом и представляющего класс в среде выполнения.