2011-09-14 9 views

Odpowiedz

18

Tak. Wszystkie przypisania referencyjne są atomiczne w java.

Należy zauważyć, że złożona instrukcja, taka jak String s = new String("foobar"), nie jest atomowa, ponieważ zawiera tworzenie obiektu, a następnie przypisanie osobno.

Należy również zauważyć, że „zadania do długich i podwójnych zmiennych nie mogą być atomowy”, z JLS-17.7

+3

Należy również zauważyć, że zadania na '' double' long' i zmienne * nie * atomowej: patrz [JLS rozdział 17.7 ] (http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7), aby uzyskać więcej informacji. – Bombe

+0

Aby podkreślić ostatnie zdanie: Jak rozumiem JLS, następujące zachowanie jest w porządku: 1. Przydziel przestrzeń dla "nowego ciągu". 2. przypisać niezainicjowany obiekt do s. 3. uruchom konstruktora. – Voo

+0

@Bombe, dzięki, że przegapiłem to, zaktualizowałem odpowiedź –

1

Tak, ale jeśli martwisz się o warunkach wyścigowych, powinien przynajmniej mieć świadomość metod „zsynchronizowanych”/Bloki.

i zauważ, że to nie jest atomowa, ponieważ zawiera dwie operacje:

String s = string_a + string_b; 
+0

Widzę tylko jedną operację, jakie są dwie operacje? –

+0

@JanusTroelsen Operacje, które widzę są następujące: 1. 'StringBuilder' instanciation; 2. 'sb.append (string_a)'; 3. 'sb.append (string_b)'; 4. 'sb.toString()'; 5. przypisz do 's' – rds

+0

@rds: Dzięki, nie wiedziałem + skompilowany do tego –