¿Una variable a la que acceden varios hilos, pero solo dentro de bloques sincronizados, necesita el modificador volátil? Si no, ¿por qué?Modificador volátil Java y bloques sincronizados
Respuesta
No es necesario utilizar volatile
dentro de synchronized
, sincronizado ya garantiza el comportamiento correcto para el caché local de variables cuando se utiliza de forma coherente (en cada acceso).
volatile
funciona en valores primitivos, y puede ser un buen atajo para accesos atómicos a un tipo primitivo. Tenga en cuenta que el comportamiento de la volatilidad ha cambiado en JDK 5 de 1.4.
Más información se puede encontrar here
No. Cuando trabaja dentro de un bloque sincronizado, todas las variables en caché se sincronizan en el acceso, ya que crea una barrera de memoria.
Para más detalles, vea esta comparación (con discusión) de volatile to synchronized.
bloques que sincronizan en el mismo objeto (o método) se garantiza que no se ejecute en el mismo tiempo. Por lo tanto, , siempre y cuando se sincronice con el mismo objeto, su variable nunca tendrá acceso simultáneo, por lo que no necesita un tratamiento especial.
Si sus accesos no están sincronizados, entonces tiene una condición de carrera. Hacer la variable volatile
puede ser correcta para algunas variables primitivas (acepto otras publicaciones para obtener más información sobre volaitle). Si eso no es útil, es casi seguro que tenga un error.
Para ser pedantes, la sincronización en otros idiomas no implica una memoria consistente: el valor puede almacenarse en caché en un registro o memoria local, y aunque el acceso esté sincronizado, puede no ser atómico/consistente. Sin embargo, en Java, sincronización activa un volátil automático. –
Para ser igualmente pedantes, los otros idiomas en los que probablemente estés pensando (C/C++) no tienen una noción intrínseca de sincronización de hilos, o incluso una palabra clave 'synchronized'; tienes que construir algo similar mutexes. Ahí tienes razón: no hay tiempo de ejecución para administrar la consistencia de la memoria para ti. ¡Esos idiomas ni siquiera especifican ninguna semántica para los accesos de memoria simultáneos! Afortunadamente Java es agradable y solo hace lo que esperas que haga. – Karmastan
@YannRamin Como en, la variable en la que se sincroniza es efectivamente volátil con el propósito de realizar modificaciones dentro de ese bloque sincronizado? No estoy seguro de si te interpreté correctamente, pero no puedo encontrar una descripción de ese efecto en otro lugar. – spieden
- 1. java: wait(), notify() y bloques sincronizados
- 2. Hilos de Java y bloques sincronizados
- 3. Volátil con sincronizados juntos
- 4. Clase segura para subprocesos en Java mediante bloques sincronizados
- 5. es una variable volátil sincronizada? (java)
- 6. Java volátil pregunta variables
- 7. matriz volátil Java?
- 8. Java referencia volátil vs AtomicReference
- 9. Mejores prácticas en métodos sincronizados en jsf y java
- 10. puntero volátil y const
- 11. Enclavado y volátil
- 12. Java serialport cerrar bloques
- 13. ¿Cómo y dónde usar el modificador estático en Java?
- 14. ¿Por qué hacer un método volátil en Java?
- 15. métodos sincronizados
- 16. Palabra clave volátil en Java - Clarificación
- 17. volátil y Thread.MemoryBarrier en C#
- 18. Java: bloques de sincronización anidados
- 19. Bloques ObjectiveC equivalente en Java
- 20. Modificador Orden de palabras clave en Java
- 21. Modificador de oscilación y final
- 22. ¿Cuándo sincronizo métodos o uso bloques sincronizados en mis métodos en un juego de Android?
- 23. sincronizados y locales copias de las variables
- 24. Diferencia entre especificador de acceso y modificador de acceso
- 25. En bloques de inicialización estáticos y no estáticos en Java
- 26. métodos de Java dos sincronizados en un caso
- 27. Bloques estáticos y variables
- 28. ¿Cómo funcionan los métodos estáticos sincronizados en Java?
- 29. ¿Están todos los métodos de Java Properties totalmente sincronizados?
- 30. sobrecarga volátil?
Puede que también le interese esta pregunta: http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and-volatile –
No. Consulte esta nueva pregunta SE: http : //stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java/34355995#34355995 –