Найти в Дзене
Java interview

Зачем нужны атомики, если есть volatile в Java?

В мире многопоточного программирования в Java существует несколько механизмов для обеспечения безопасности и согласованности данных при работе с несколькими потоками. Один из таких механизмов - это ключевое слово volatile, которое обозначает, что значение переменной может быть изменено несколькими потоками и что изменения должны быть видны всем потокам немедленно. Однако, помимо volatile, в Java также существует понятие атомиков, представленное классами из пакета java.util.concurrent.atomic. В этой статье мы рассмотрим, почему иногда атомики предпочтительнее volatile и когда их использование оправдано. Когда переменная объявлена как volatile, операции чтения и записи этой переменной атомарны (то есть не могут быть прерваны другими потоками). Однако, для операций, которые не являются простыми чтениями или записями, volatile не обеспечивает атомарности. Например, инкрементация volatile переменной counter в приведенном ниже коде не является атомарной, потому что это не только чтение и зап

В мире многопоточного программирования в Java существует несколько механизмов для обеспечения безопасности и согласованности данных при работе с несколькими потоками. Один из таких механизмов - это ключевое слово volatile, которое обозначает, что значение переменной может быть изменено несколькими потоками и что изменения должны быть видны всем потокам немедленно. Однако, помимо volatile, в Java также существует понятие атомиков, представленное классами из пакета java.util.concurrent.atomic. В этой статье мы рассмотрим, почему иногда атомики предпочтительнее volatile и когда их использование оправдано.

Когда переменная объявлена как volatile, операции чтения и записи этой переменной атомарны (то есть не могут быть прерваны другими потоками). Однако, для операций, которые не являются простыми чтениями или записями, volatile не обеспечивает атомарности. Например, инкрементация volatile переменной counter в приведенном ниже коде не является атомарной, потому что это не только чтение и запись, но и инкрементация, что может привести к состоянию гонки.

Результат работы данного кода всегда будет разный.

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

-2

Результатом выполнения всегда будет 20_000.

volatile обеспечивает только атомарность для чтения и записи переменных, в то время как атомики позволяют выполнять атомарные операции над значениями переменных. Это позволяет избежать необходимости использовать синхронизированные блоки или другие механизмы синхронизации для защиты критических секций кода.