En Java, las otras variables básicas son atómicas, excepto las variables de 8 bytes y 64 bits de Long y Double.
El modelo de almacenamiento Java requiere que tanto las operaciones get como las de almacenamiento sean atómicas, pero para variables largas y dobles no volátiles, la JVM permite dividir una lectura o escritura de 64 bits en dos operaciones de 32 bits.
Si la lectura y escritura ocurren en hilos diferentes, leer un tipo no volátil largo puede resultar en 32 bits altos de un valor y 32 bits bajos del otro.
Así que, aunque no te importe el uso de datos caducados, puede que no sea seguro usar variables largas y dobles compartidas y mutables en un programa multihilo a menos que se declaren volátiles o estén protegidas con un bloqueo.
Hablando de operaciones atómicas, significa que leer y escribir son atómicos, como i=5; Esto es una operación atómica.
Sin embargo, si la operación de dos átomos se realiza conjuntamente, no es necesariamente atómica, como leer primero y luego escribir, entonces es posible que la variable haya sido modificada tras la lectura.
i++ es una de esas operaciones, primero leer y luego escribir, por lo que la variable entera es atómica, no que i++ sea una operación atómica.
Cuando usas for(int i=0; i<10000; i++){System.out.print(i)}
Verás que al final no imprimiré 10.000, y imprimiré unas 8-9 mil.
Pero en el caso del multihilo, incluso si la variable entera es atómica, puede haber problemas de seguridad en los hilos, que es un problema de visibilidad del hilo, por lo que necesitas añadir una sentencia volátil.
Este modificador es una variable forzada que se lee de memoria cada vez y no se almacena en los registros. |