Jakie operacje w Javie są uważane za atomowe?
Odpowiedzi:
a może coś więcej. Spójrz na jls .
Jak zauważono w komentarzach, atomowość nie oznacza widoczności. Więc chociaż gwarantuje się int
, że inny wątek nie zobaczy części zapisanej , może nigdy nie zobaczyć nowej wartości.
Operacje na long i double są również wykonywane na zwykłych atomowych procesorach 64-bitowych , chociaż nie ma gwarancji. Zobacz także tę prośbę o funkcję .
64 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;
}
}
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.
value
. To jest volatile
.
value
to volatile
nie czyni przypisanie value
atomowych, to po prostu unika „Publikowanie” kwestii.
volatile
długich i podwójnych z pewnością będą atomowe: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7