Які операції в Java вважаються атомними?
Відповіді:
а може і щось більше. Подивіться на jls .
Як зазначалося в коментарях, атомність не означає видимість. Отже, хоча інший потік гарантовано не бачить частково записаного int
, він може ніколи не побачити нового значення.
Операції над довгими та подвійними також виконуються на загальноприйнятих 64-бітних процесорах, атомних , хоча гарантій немає. Див. Також цей запит на функцію .
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