2010-08-23 22 views
98

¿Puede alguien explicar qué significan los modificadores transient y volatile en Java?¿Qué son los modificadores transitorios y volátiles? -

+3

Esto claramente no era una pregunta y esto es un duplicado de todos modos (que es por eso he votado para cerrar). Ver por ejemplo [¿Por qué Java tiene variables transitorias?] (Http: // stackoverflow.com/questions/910374/why-does-java-have-transient-variables) y [¿Cuándo exactamente usa la palabra clave volátil en Java?] (http://stackoverflow.com/questions/3488703/when-exactly-do -you-use-the-volátil-keyword-in-java) (y muchos otros). –

+0

posible duplicado de [¿Para qué se usa "volátil"?] (Http://stackoverflow.com/questions/3430757/for-what-is-used-volatile) – Jeff

+17

Esta es una pregunta perfectamente válida, equivalente a: http: //stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private/215505 –

Respuesta

7

Volatile significa que otros subprocesos pueden editar esa variable en particular. Entonces el compilador les permite el acceso.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

transitoria significa que al serializar un objeto, éste volverá a su valor por defecto en de-serialización

http://www.geekinterview.com/question_details/2

+4

"Por lo que el compilador permite el acceso a ellos". Su oración sugiere que los hilos no tienen acceso por defecto. Ahora leo el enlace y entiendo la otra respuesta: el compilador no hace ningún tipo de almacenamiento intermedio específico de subprocesos de la variable para que otros subprocesos puedan ver los cambios inmediatamente. – helios

+0

Obtuve el uso de C de los volátiles y el uso de volátil de Java. Quise decir que el compilador asegura que tiene acceso al valor de actaul del campo en lugar de un valor en caché. – Raynos

+0

significa más que eso. –

121

Los volatile y transient modificadores se aplican a los campos de clases.

El modificador transient le dice al subsistema de serialización de objetos Java que excluya el campo al serializar una instancia de la clase. Cuando el objeto se deserializa, el campo se inicializará al valor predeterminado; es decir, null para un tipo de referencia, y cero o false para un tipo primitivo. Tenga en cuenta que el JLS (consulte 8.3.1.3) no indica lo que significa transient, sino que difiere al Java Object Serialization Specification. Otros mecanismos de serialización no estándar también pueden prestar atención al campo transient -ness.

El modificador volatile le dice a la JVM que las escrituras en el campo siempre se deben enjuagar de forma síncrona en la memoria, y que las lecturas del campo siempre deben leerse desde la memoria. Esto significa que los campos marcados como volátiles se pueden acceder y actualizar de forma segura en una aplicación de múltiples subprocesos sin utilizar la sincronización nativa o estándar basada en la biblioteca. Del mismo modo, las lecturas y escrituras en campos volátiles son atómicas. (Esto no se aplica a >> no volátil < < long o double campos, que pueden ser objeto de "palabra desgarre" en algunas JVM). Las partes pertinentes de la JLS son 8.3.1.4, 17.4 y 17.7.

+3

Transitorio: el modificador transitorio se aplica solo a variables y no se almacena como parte del estado persistente de su objeto. Las variables transitorias no están serializadas. Volátil: el modificador volátil se aplica únicamente a las variables y le dice al compilador que la variable modificada por el volátil puede cambiarse inesperadamente por otras partes del programa. –

+3

@Vijay - Incorrecto. Las variables transitorias * podrían * ser serializadas, dependiendo de qué mecanismo de serialización se use. La Especificación del lenguaje Java no especifica esto. Tu definición de volátil también es incorrecta. Las variables volátiles y no volátiles pueden cambiarse inesperadamente por alguna otra parte de un programa. Volátil simplemente proporciona una semántica más estricta para leer y escribir con respecto al modelo de memoria de Java. –

+4

@Vijay - también transitorio y volátil * solo * se aplica a los campos de clases. * No * se aplican a las variables locales. –

0

palabra clave volátil y transitoria

1) palabras clave transitoria se utiliza junto con las variables de instancia para excluirlas de proceso de serialización. Si un campo es transitorio, su valor no se mantendrá.

Por otro lado, la palabra clave volátil se utiliza para marcar una variable de Java como "está almacenada en la memoria principal".

Cada lectura de una variable volátil se leerá en la memoria principal de la computadora, y no desde la memoria caché de la CPU, y cada escritura en una variable volátil se escribirá en la memoria principal y no solo en la memoria caché de la CPU.

2) la palabra clave transitoria no se puede utilizar junto con la palabra clave estática, pero se puede usar volátil junto con la estática.

3) las variables transitorias se inicializan con el valor predeterminado durante la deserialización y la asignación o restauración del valor debe ser manejada por el código de la aplicación.

Para obtener más información, vea mi blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html

Cuestiones relacionadas