2011-09-14 14 views

risposta

18

. Tutti i compiti di riferimento sono atomici in java.

Basta notare che una dichiarazione composita come String s = new String("foobar") non è atomica, poiché comprende una creazione dell'oggetto e quindi un'assegnazione separata.

Si noti inoltre che "le assegnazioni alle variabili lunghe e doppie possono non essere atomica", da JLS-17.7

+3

Va inoltre notato che le assegnazioni a '' double' long' e variabili sono * non * atomico: si veda [capitolo JLS 17,7 ] (http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7) per ulteriori informazioni. – Bombe

+0

Per enfatizzare l'ultima frase: come ho capito JLS, il seguente comportamento va bene: 1. Assegna spazio per "nuova stringa". 2. assegnare un oggetto non inizializzato a s. 3. eseguire il costruttore. – Voo

+0

@Bombe, grazie l'ho perso, ho aggiornato la risposta –

1

Sì, ma se siete preoccupati per le condizioni di gara, si dovrebbe almeno essere a conoscenza di metodi 'sincronizzati'/blocchi.

E si noti che questo non è atomica perché contiene due operazioni:

String s = string_a + string_b; 
+0

vedo solo un'operazione, quali sono le due operazioni? –

+0

@JanusTroelsen Le operazioni che vedo sono: 1. instanciation 'StringBuilder'; 2. 'sb.append (string_a)'; 3. 'sb.append (string_b)'; 4. 'sb.toString()'; 5. assegnare a 's' – rds

+0

@rds: Grazie, non sapevo + compilato per quello –