2009-02-05 7 views
20

La lettura e la scrittura di una singola variabile è atomica (garanzia linguistica!), A meno che la variabile non sia di tipo lungo o doppio.La scrittura lunga e doppia non è atomica in Java?

Stavo leggendo le diapositive di un corso e l'ho trovato scritto. La lezione riguardava la concorrenza.

Qualcuno può spiegarmi perché scrivere un lungo o un doppio non è un'operazione atomica? Mi ha davvero sorpreso.

+0

1.) Che lingua/ambiente? 2.) Il link che hai postato è protetto da password –

+0

oh sry: S firefox sta memorizzando la password in totale lo ha dimenticato – fmsf

+0

e dice che è indipendente dalla lingua – fmsf

risposta

28

Non è atomico perché è un'operazione a più passaggi a livello di codice macchina. Cioè, long e double sono più lunghi della lunghezza del word del processore.

+3

Giusto. E su una macchina a 64 bit con una lunghezza di 64 bit, scrivere a lungo probabilmente * sarà * atomico, a meno che tu non stia parlando di una JVM o qualcosa del genere. –

+0

in una 64 macchina un lungo avrà 128 bit come l'int già come 64 – fmsf

+7

Dipende dal langauge credo. Sono abbastanza sicuro che i tipi primitivi di Java garantiscano una lunghezza particolare su tutte le macchine. –

23

solo per chiarire la situazione per Java, raddoppia e desidera non vengono letti o scritti atomicamente meno che non siano dichiarate volatile

JLS - Nonatomic Treatment of double and long

+5

queste operazioni sono atomiche in JVM a 64 bit, che è la norma in questi giorni –

+3

Solo per eseguire il backup di Amrish, ho guardato una presentazione (tavola rotonda) con Cliff Click e Doug Lea e il punto è stato fatto da Cliff che raddoppia e efficacemente atomico su JVM a 64 bit. Quindi sì, il modello di memoria Java dice che abbiamo bisogno strettamente di volatile per le operazioni atomiche su long, ma su JVM a 64 bit non è il caso. –

+3

@AmrishPandey * queste operazioni sono atomiche in JVM a 64 bit * vorresti condividere link supporing o ulteriori URL di lettura? – roottraveller

2
modello di memoria linguaggio di programmazione Java

, una singola scrittura di un non- Il valore volatile lungo o doppio viene considerato come due scritture separate: una per ciascuna metà a 32 bit. Ciò può comportare una situazione in cui un thread vede i primi 32 bit di un valore a 64 bit da una scrittura e il secondo 32 bit da un'altra scrittura.

+0

Potrebbe ** essere ** due scritture separate. – Pacerier

1

Java long e double non sono atomici in macchine a 32 bit, ma atomici in macchine a 64 bit con alcune JVM a 64 bit. perché dipende dalla lunghezza del bit della macchina? Perché la macchina a 32 bit ha bisogno di due scritture a lungo (fino a 64 bit). Leggi this per informazioni dettagliate.

0

Molti programmatori devono aver letto questa affermazione in "3.1.2 Operazioni non a 64 ° bit" nella concorrenza java nella pratica. Ho reffered l'ultimo JLS https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.7. Non dicono ancora da nessuna parte che i jVM a 64 bit siano di norma in questi giorni. Quindi le operazioni a 64 bit sono suddivise in operazioni a 32 bit che interrompono l'atomicità e sono pericolose da utilizzare nell'ambiente multithread fino a quando non vengono dichiarate volatili. Lungo e doppio sono lunghi 64 bit in java. Quindi le operazioni di scrittura e lettura non sono atomiche in java.

+0

Si prega di modificare la risposta in modo corretto. –