Какие операции в Java считаются атомарными?
Какие операции в Java считаются атомарными?
Ответы (3)
- все присваивания примитивных типов, кроме long и double
- все присвоения ссылок
- все присвоения изменчивых переменных
- все операции классов java.concurrent.Atomic *
а может еще что-то. Посмотрите на jls.
Как отмечено в комментариях, атомарность не подразумевает видимости. Таким образом, хотя другой поток гарантированно не увидит частично написанное int
, он может никогда не увидеть новое значение.
Операции с long и double выполняются также на обычных 64-битных процессорах атомарных, хотя гарантии нет. См. Также этот запрос функции.
64 bit jvm, long and double assignments are also atomic.
Вы уверены? Я бы сказал, что они предназначены для скомпилированного кода, но как насчет интерпретируемого кода? Наверное, ты прав, но есть ли гарантия?
- person maaartinus; 21.01.2011
a *= b + c
, все зависит от того, откуда берутся операнды. Используя локальные переменные, вы можете свести все это к присваиваниям и вычислениям с локальными переменными. Первое было рассмотрено выше, второе является атомарным, поскольку не имеет дело с памятью.
- person maaartinus; 19.06.2013
Unsafe
, что довольно небезопасно и непереносимо. Есть предложение стандартизировать такие операции.
- person maaartinus; 06.02.2015
В 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;
}
Обратите внимание на отсутствие какой-либо синхронизации.
value
. Это volatile
.
- person maaartinus; 18.10.2013
value
равно volatile
, не делает присвоение value
атомарным, это просто позволяет избежать проблем с публикацией.
- person Lyle Z; 05.11.2013