Які операції в 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