Какие операции в Java считаются атомными?
Какие операции в Java считаются атомными?
Ответ 1
- все назначения примитивных типов, за исключением длинных и двойных
- все назначения ссылок
- все назначения изменчивых переменных
- все операции java.concurrent.Atomic * classes
и, возможно, нечто большее. Посмотрите jls.
Как отмечается в комментариях, атомарность не подразумевает видимость. Поэтому, в то время как другой поток гарантированно не видит частично написанного int
, он никогда не увидит новое значение.
Операции с длинными и двойными находятся на общих 64-битных ЦП атомных, а, хотя нет никакой гарантии. См. Также этот запрос функции.
Ответ 2
В Java чтение и запись 32-разрядных или меньших величин гарантированно будет атомным.
Под атомом мы подразумеваем, что каждое действие происходит за один шаг и не может быть прервано. Таким образом, когда у нас есть многопоточные приложения, операции чтения и записи являются потокобезопасными и не требуют синхронизации.
Например, следующий код является безопасным потоком:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
Ответ 3
Казалось бы, назначения longs являются атомарными, основанными на этом методе в AtomicLong.java:
public final void set(long newValue) {
value = newValue;
}
Обратите внимание на отсутствие какой-либо синхронизации.