Какие операции в 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;
}

Обратите внимание на отсутствие какой-либо синхронизации.

Другие вопросы по тегам