Какие операции в Java считаются атомарными? - PullRequest
75 голосов
/ 21 января 2011

Какие операции в Java считаются атомарными?

Ответы [ 3 ]

92 голосов
/ 21 января 2011
  • все назначения примитивных типов, кроме длинных и двойных
  • все присвоения ссылок
  • все присвоения изменчивых переменных
  • все операции java.concurrent.Atomic * классы

и, может быть, что-то еще. Посмотрите на jls .

Как отмечается в комментариях, атомарность не подразумевает видимость. Таким образом, хотя другой поток гарантированно не увидит частично записанное int, он может никогда не увидеть новое значение.

Операции на long и double выполняются на обычных 64-битных процессорах также атомарные , хотя гарантии нет. Смотрите также этот запрос функции .

4 голосов
/ 30 января 2011

В Java чтение и запись 32-битных или меньших величин гарантированно являются атомарными.
Под атомным мы подразумеваем, что каждое действие происходит за один шаг и не может быть прервано. Таким образом, когда у нас многопоточные приложения, операции чтения и записи являются поточно-ориентированными и не требуют синхронизации.

Например, следующий код является поточно-ориентированным:

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }
0 голосов
/ 18 октября 2013

Может показаться , что назначения длин являются атомарными, основываясь на этом методе в AtomicLong.java:

public final void set(long newValue) {
    value = newValue;
}

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

...