Какие операции в Java считаются атомарными?
Ответы:
а может что-то еще. Посмотрите на jls .
Как отмечено в комментариях, атомарность не подразумевает видимости. Таким образом, хотя другой поток гарантированно не увидит частично написанное int
, он может никогда не увидеть новое значение.
Операции с long и double также выполняются на обычных 64-битных процессорах atomic , хотя нет никаких гарантий. См. Также этот запрос функции .
64 bit jvm, long and double assignments are also atomic.
Вы уверены? Я бы сказал, что они предназначены для скомпилированного кода, но как насчет интерпретируемого кода? Наверное, ты прав, но есть ли гарантия?
В Java чтение и запись 32-битных или меньших количеств гарантированно атомарны.
Под атомарным мы подразумеваем, что каждое действие происходит за один шаг и не может быть прервано. Таким образом, когда у нас есть многопоточные приложения, операции чтения и записи являются потокобезопасными и не требуют синхронизации.
Например, следующий код является потокобезопасным:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
Было бы показаться , что уступка долгот атомарные, на основе этого метода в AtomicLong.java:
public final void set(long newValue) {
value = newValue;
}
Обратите внимание на отсутствие какой-либо синхронизации.
value
. Это volatile
.
value
есть volatile
не делает назначение value
атомных, он просто избегает «публикации» вопросов.
volatile
длинные и двойные позиции гарантированно будут атомарными: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7