Recentemente ho sentito in una conversazione che una scrittura su un volatile innesca una barriera di memoria per ogni variabile a cui il thread ha scritto. È davvero corretto? Dal JLS, sembra che solo la variabile in questione si svuota, ma non altri. Qualcuno sa cosa è effettivamente corretto? Posso indicarmi una posizione concreta nel JLS?È una scrittura su una barriera di memoria volatile in Java
risposta
Il riferimento Volatile variables and other variables stato corretto. Non mi ero reso conto che la transitività di happen-before è qualcosa che deve essere implementato dalla VM, non qualcosa che deriva dalla definizione. Sono ancora perplesso sul fatto che qualcosa con conseguenze di così vasta portata non sia indicato chiaramente, ma in realtà un corollario di una certa definizione. Per avvolgetelo: Supponiamo di avere 4 azioni di questo tipo:.
thread1 thread2
a1
a2
a3
a4
dove a2 è una scrittura ad una variabile V volatile e A3 è una lettura dallo stesso v variabile volatili Da quanto definiton di accade -before (hb) che hb (a1, a2) e hb (a3, a4). Inoltre, per i volatili abbiamo hb (a2, a3). Segue ora dalla transitività richiesta di hb that hb (a1, a3). Quindi la scrittura e la successiva lettura della variabile volatile v funge da barriera di memoria.
Sì, avvierà una barriera. Puoi leggere di più here. Esistono 4 tipi, Load Load Load Store Store Store Store Load.
Per quanto riguarda la tua domanda
Dal JLS, sembra che solo la variabile in questione si svuota fuori, ma non gli altri. Qualcuno sa cosa è effettivamente corretto?
Tutte le scritture che si verificano prima di un archivio volatile sono visibili da altri thread con il predicato che gli altri thread caricano questo nuovo archivio. Tuttavia, le scritture che si verificano prima di un carico volatile possono o non possono essere viste da altri thread se non caricano il nuovo valore.
Per un esempio pratico
volatile int a =0;
int b = 0;
Thread-1
b = 10;
a = 3;
Thread-2
if(a == 0){
// b can b 10 or 0
}
if(a == 3){
// b is guaranteed to be 10 (according to the JMM)
}
+1 * "con il predicato che gli altri thread caricano questo nuovo archivio" * – assylias
Penso che il tuo esempio sia sbagliato. Thread-2 non ha bisogno di confrontare 'a' a 3 per vedere il nuovo valore di' b', è sufficiente leggere 'a'. Quindi immediatamente dopo la prima riga, Thread-2 è garantito per vedere 'b' uguale a 10 (in tutti i rami). Tuttavia, un terzo thread che non legge mai 'a' non è garantito per vedere il nuovo valore di' b'. –
@PhilippWendler Penso che il punto fosse: se a == 0, la scrittura 'a = 3' non è ancora avvenuta e b può essere qualsiasi cosa, incluso 10. se a == 3, è stato scritto' a = 3' e sei garantito di avere b == 10. – assylias
- 1. Interlocked.CompareExchange utilizza una barriera di memoria?
- 2. Sovraccarico di una barriera di memoria/recinzione
- 3. Perché ho bisogno di una barriera di memoria?
- 4. come è una barriera di memoria nel kernel di Linux è usato
- 5. è una variabile volatile sincronizzata? (java)
- 6. Scrittura di un gestore di memoria in una lingua gestita?
- 7. È volatile costoso?
- 8. Quando è sicuro distruggere una barriera pthread?
- 9. Come decompilare la variabile volatile in Java?
- 10. WaitForSingleObject funge da barriera di memoria?
- 11. Java volatile legge le scritture di svuotamento e fa letture di aggiornamento di scrittura volatile
- 12. È indicativo di una perdita di memoria in Java?
- 13. Barriera interblocco su CUDA
- 14. scrittura atomica su una presa
- 15. Sincronizza accesso in scrittura al campo Volatile (blocco di lettura/scrittura economico)
- 16. Implementazione di una barriera di sincronizzazione in Ruby
- 17. Il blocco MPI_Reduce (o una barriera naturale)?
- 18. Scrittura e lettura di una stringa in una memoria interna in Android
- 19. Scrittura di file su una memoria esterna in Android non funzionante
- 20. Barriera di ottimizzazione per i microbenchmarks in MSVC: indicare all'ottimizzatore che memoria del clobber?
- 21. puntatori in una struct volatile C
- 22. Java/Android: lettura/scrittura di un array di byte su una presa
- 23. Alla ricerca di una semplice cache in memoria Java
- 24. È richiesto `volatile` per il blocco con doppio controllo in Java ma non C#?
- 25. Perché non volatile su System.Double e System.Long?
- 26. Scrittura/lettura di Array di stringhe su memoria interna android
- 27. Come ottenere una scrittura esclusiva, ma una lettura non esclusiva?
- 28. Scrittura su un file temporaneo in java
- 29. Quando utilizzare volatile con memoria CUDA condivisa
- 30. Scrittura di una stringa IO su stdout in Haskell
La mia interpretazione del JLS è d'accordo con la vostra. – NPE
possibile duplicato di [Variabili volatili e altre variabili] (http://stackoverflow.com/questions/12438464/volatile-variables-and-other-variables) – assylias
Come chiarisce la risposta, non è solo la variabile dichiarata come volatile ma tutto scrive che è accaduto prima della volatile scrittura. – sjlee