Jakie operacje w Javie są uważane za atomowe?
java
multithreading
atomicity
robinmag
źródło
źródło
volatile
długich i podwójnych z pewnością będą atomowe: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.764 bit jvm, long and double assignments are also atomic.
Jesteś pewny? Powiedziałbym, że są przeznaczone do skompilowanego kodu, ale co z kodem interpretowanym? Prawdopodobnie masz rację, ale czy jest jakaś gwarancja?W Javie gwarantuje się atomowe odczytywanie i zapisywanie ilości 32-bitowych lub mniejszych.
Przez atomową rozumiemy, że każda akcja odbywa się w jednym kroku i nie można jej przerwać. Tak więc, gdy mamy aplikacje wielowątkowe, operacje odczytu i zapisu są bezpieczne dla wątków i nie muszą być synchronizowane.
Na przykład poniższy kod jest bezpieczny dla wątków:
public class ThreadSafe { private int x; public void setX(int x) { this.x = x; } }
źródło
Wydawałoby się, że przypisania longs są atomowe, oparte na tej metodzie w AtomicLong.java:
public final void set(long newValue) { value = newValue; }
Zwróć uwagę na brak jakiejkolwiek synchronizacji.
źródło
value
. To jestvolatile
.value
tovolatile
nie czyni przypisanievalue
atomowych, to po prostu unika „Publikowanie” kwestii.