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

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

3 ответов


  • все назначения примитивных типов, за исключением long и double
  • все задания ссылок
  • все задания volatile переменных
  • все операции java.параллельный.Atomic * classes

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

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

операции на long и double находятся на общих 64-битных процессорах атомные а также, хотя нет никакой гарантии. Смотрите также это запрос.


в 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;
}

обратите внимание на отсутствие синхронизации.