Eric, he leído sus comentarios y uno en particular me sorprende
De hecho, puedo entender el uso de volátiles en el concepto nivel. Sin embargo, para la práctica, no se me ocurre el código que tiene la concurrencia problemas sin utilizar volátil
El problema obvio que puede tener son reordenamientos del compilador, por ejemplo, la más famosa de elevación como se ha mencionado por Simon Nickerson. Pero supongamos que no habrá reordenamientos, ese comentario puede ser válido.
Otro problema que resuelve volátil es con variables de 64 bits (largo, doble). Si escribe en una larga o doble, se trata como dos tiendas separadas de 32 bits. Lo que puede suceder con una escritura simultánea es que el alto 32 de un hilo se escribe en los 32 bits altos del registro, mientras que otro hilo escribe los 32 bits bajos.Entonces puede tener un largo que no sea ni uno ni el otro.
Además, si observa la sección de memoria del JLS, observará que se trata de un modelo de memoria relajado.
Eso significa que las escrituras pueden no ser visibles (pueden estar en el búfer de la tienda) por un tiempo. Esto puede llevar a lecturas obsoletas. Ahora puede decir que parece poco probable, y lo es, pero su programa es incorrecto y tiene el potencial de fallar.
Si tiene un int que está incrementando durante la vida útil de una aplicación y sabe (o al menos piensa) que el desbordamiento de la información no se ampliará, no podrá actualizarlo a una extensión larga, pero aún es posible. . En el caso de un problema de visibilidad de la memoria, si cree que no debería afectarlo, debe saber que todavía puede y puede causar errores en su aplicación simultánea que son extremadamente difíciles de identificar. La corrección es la razón para usar volátil.
'volatile' (y muchos otros aspectos relacionados con la concurrencia) están ** ** muy duro demostrar, porque si los usa incorrectamente, entonces * todavía * pueden parecer que funcionan correctamente y no muestran un problema hasta que ocurre una condición muy específica y ocasiona un problema. –
He intentado esto por mí mismo y he producido una prueba que pasa los valores entre las hebras utilizando un campo no volátil mil millones de veces con éxito, sin embargo, falla relativamente rápido cuando se carga la misma caja. Incluso medir el impacto en el rendimiento de los volátiles es muy difícil, depende de muchos factores. –