entiendo que para el tipo primitivo, volátil puede reflejar los cambios de valor de otro hilo inmediatamente
Usted entiende incorrectamente en al menos tres formas. No intente usar volátiles hasta que comprenda a fondo todo sobre modelos de memoria débil, semántica de adquisición y liberación y cómo afectan su programa.
En primer lugar, tenga en claro que la volatilidad afecta a variables, no valores.
En segundo lugar, volátil no afecta las variables que contienen valores de tipos de valores de manera diferente que afecta a las variables que contienen referencias.
Tercero, volátil no significa que los cambios de valor de otros subprocesos son visibles inmediatamente. Volátil significa que las variables tienen adquisición y release semántica. La volatilidad afecta a el orden en que se pueden observar los efectos secundarios de las mutaciones en la memoria a partir de un hilo en particular.La idea de que existe un orden universal coherente de mutaciones y que esas mutaciones en ese orden pueden observarse instantáneamente desde todos los hilos no es una garantía hecha por el modelo de memoria.
Sin embargo, ¿qué ocurre con el contenido del objeto?
¿Qué hay? La ubicación de almacenamiento a la que hace referencia una variable volátil de tipo de referencia no necesita tener características de subprocesamiento particulares.
Si un hilo llama a la función AddValue, la dirección de la lista no cambia, se actualizará otro hilo sobre el cambio de "contenido" de la lista.
Nop. ¿Por qué lo haría? Ese otro hilo podría estar en un procesador diferente, y ese caché del procesador podría haber precargado la página que contiene la dirección de la matriz que está respaldando la lista. La modificación de la lista puede haber cambiado la ubicación de almacenamiento que contiene la dirección de la matriz para hacer referencia a una ubicación completamente diferente.
Por supuesto, la clase de lista no es insegura desde el principio. Si no estás bloqueando el acceso a la lista, entonces la lista simplemente puede bloquearse y morir cuando tratas de hacerlo.
No necesita volátiles; lo que necesita es colocar bloqueos de hilo alrededor de los accesos a la lista. Como las cerraduras de rosca inducen vallas completas, no debería necesitar medias vallas introducidas por volátiles.
No estoy seguro de esto, pero supongo que dado que la lista es solo un puntero (dirección), cuando el contenido se actualiza se refleja inmediatamente en todas partes, ya que el contenido residiría en el montón, sin embargo, con cambio de direcciones, la pila ha cambiado, y creo que puede residir en un único núcleo. Pero, como dije, no hay experto. Es solo una suposición. – Alxandr
Además, como nota al margen. volátiles volátiles de muchas optimizaciones. MUCHAS optimizaciones. Algunos recomiendan encarecidamente no usar modificadores volátiles, sino usar volatileread y volatilewrite cuando sea necesario (algunos métodos globales estáticos encontrados en una clase en el espacio de nombres del sistema, probablemente se encuentren en google). – Alxandr
@Alxandr: ten cuidado. La lectura volátil y la escritura volátil son métodos potencialmente costosos para llamar e inducen * vallas completas *, no las medias vallas que uno esperaría. Si está escribiendo código sin bloqueo por motivos de rendimiento (¿y qué otra razón tendría para hacer esta locura?) Es muy posible que VolatileRead y VolatileWrite sean peores. Tienes que perfilarlo cuidadosamente. –