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