2011-01-21 15 views

Odpowiedz

80
  • wszystkie zadania prymitywnych typów z wyjątkiem długich i podwójnych
  • wszystkich zadań odniesień
  • wszystkie przypisania zmiennych lotnych
  • wszystkie operacje java.concurrent.Atomic * klas

i może coś więcej. Spójrz na jls.

Jak zaznaczono w komentarzach, atomowość nie oznacza widoczności. Tak więc, podczas gdy inny wątek jest gwarantowany, aby nie widzieć częściowo zapisanego int, może nigdy nie zobaczyć nowej wartości.

Operacje na długich i podwójnych są na wspólnych 64-bitowych procesorach atomic as well, chociaż nie ma żadnej gwarancji. Zobacz także ten feature request.

+18

Przypisania do 'volatile' longs i doubles gwarantują atomową: http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7 –

+10

Pamiętaj również, że podczas operacje są atomowe, widoczność tych operacji może nie być zagwarantowana w aplikacji wielowątkowej, chyba że zostanie podjęta szczególna troska (szczegóły tutaj są * droga * do zawiłości opisania w komentarzu). – nos

+0

64-bitowe jvm, długie i podwójne przypisania są również atomowe. –

4

W języku Java odczyt i zapis 32-bitowych lub mniejszych wielkości gwarantują atomową.
Według atomów mamy na myśli, że każda akcja ma miejsce w jednym kroku i nie można jej przerwać. Tak więc, gdy mamy aplikacje wielowątkowe, operacje odczytu i zapisu są wątkowo bezpieczne i nie muszą być synchronizowane.

Na przykład następujący kod jest wątek bezpieczne:

public class ThreadSafe 
    { 
    private int x; 
    public void setX(int x) 
      { 
      this.x = x; 
      } 
    } 
+5

..threadsafe w tym sensie, że wartość zawsze będzie dokładnie taka sama jak pierwotna wartość lub ustawiona wartość. Większość aktualnych wartości wciąż nie jest widoczna dla innych wątków z powodu braku "niestabilności" lub "zsynchronizowania". –

+1

+1 do tego, co mówi @MikkoWilkman. Ten fragment kodu nie powinien być używany, ponieważ z pewnością nie jest wątkiem bezpiecznym z perspektywy widoczności pamięci. –

0

Byłoby wydają że cesje tęskni są niepodzielne, na podstawie tej metody w AtomicLong.java:

public final void set(long newValue) { 
    value = newValue; 
} 

Note brak jakiejkolwiek synchronizacji.

+3

Spójrz na deklarację "wartości". To 'volatile'. – maaartinus

+1

Ta "wartość" jest "lotna", nie czyni przypisania "wartości" atomową, po prostu unika problemów "publikowania". –

+6

Wykonuje oba, patrz [JLS, sekcja 17.7] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7): Zapisuje i odczytuje lotny długi a podwójne wartości są zawsze atomowe. – maaartinus

Powiązane problemy