¿Qué son los modificadores transitorios y volátiles?

126

¿Alguien puede explicar qué significan los modificadores transienty volatileen Java?

Vijay Bhaskar Semwal
fuente
3
Esto claramente no era una pregunta y de todos modos es un duplicado (por eso voté para cerrar). Ver por ejemplo ¿Por qué Java tiene variables transitorias? ¿ Cuándo utiliza exactamente la palabra clave volátil en Java? (y los muchos otros).
Pascal Thivent
posible duplicado de ¿Para qué se usa "volátil"?
Jeff
18
Esta es una pregunta perfectamente válida, equivalente a: stackoverflow.com/questions/215497/…
Barry Fruitman

Respuestas:

156

Los modificadores volatiley transientse pueden aplicar a los campos de las clases 1 independientemente del tipo de campo. Aparte de eso, no están relacionados.

El transientmodificador 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, nullpara un tipo de referencia y cero o falsepara un tipo primitivo. Tenga en cuenta que el JLS (ver 8.3.1.3 ) no dice qué transientsignifica, sino que difiere de la Especificación de serialización de objetos Java . Otros mecanismos de serialización pueden prestar atención a la transientintensidad de un campo . O pueden ignorarlo.

(Tenga en cuenta que el JLS permite que un staticcampo se declare como transient. Esta combinación no tiene sentido para la serialización de objetos Java, ya que de todos modos no serializa estadísticas. Sin embargo, podría tener sentido en otros contextos, por lo que hay alguna justificación para sin prohibirlo directamente)

El volatilemodificador le dice a la JVM que las escrituras en el campo siempre deben vaciarse sincrónicamente a la memoria, y que las lecturas del campo siempre deben leerse en la memoria. Esto significa que los campos marcados como volátiles se pueden acceder y actualizar de forma segura en una aplicación de subprocesos múltiples 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átiles << longo doublecampos, que pueden estar sujetos a "rotura de palabras" en algunas JVM). Las partes relevantes de JLS son 8.3.1.4 , 17.4 y 17.7 .


1 - Pero no a las variables o parámetros locales.

Stephen C
fuente
10

volatiley transientpalabras clave

1) la transientpalabra clave se usa junto con las variables de instancia para excluirlas del proceso de serialización. Si un campo es transientsu valor no se conservará.

Por otro lado, la volatilepalabra clave se usa para marcar una variable Java como "almacenada en la memoria principal".

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

2) la transientpalabra clave no se puede usar junto con la staticpalabra clave pero volatilese puede usar junto con static.

3) las transientvariables 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, consulte mi blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html

Rajesh Dixit
fuente
2
La razón por la que la transientvariable no se puede usar junto con la staticpalabra clave es que las variables estáticas pertenecen a una clase y no a ninguna instancia individual. El concepto de serialización se refiere al estado actual del objeto. Solo los datos asociados con una instancia específica de una clase se serializan, por lo tanto, los campos de miembros estáticos se ignoran durante la serialización
Chaklader Asfak Arefe
En realidad, el JLS permite staticy se transientdeben usar juntos. El problema es que tiene poco sentido, porque los mecanismos de serialización típicos no persisten estáticos de todos modos.
Stephen C
7

Volátil significa que otros hilos pueden editar esa variable en particular. Entonces el compilador permite el acceso a ellos.

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

Transitorio significa que cuando serializa un objeto, devolverá su valor predeterminado en la deserialización

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

Raynos
fuente
55
"Entonces 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 subproceso de la variable para que otros subprocesos puedan ver los cambios de inmediato.
helios
Obtuve el uso de C de volátil y el uso de Java de volátil confundido. Quise decir que el compilador asegura que tiene acceso al valor actaul del campo en lugar de un valor en caché.
Raynos
significa más que eso.
Stephen C
1

Transitoria:

Primero necesita saber dónde necesitaba cómo cerrar la brecha.

1) Un modificador de acceso transitorio solo es aplicable al componente variable solamente. No se usará con método o clase.

2) La palabra clave transitoria no se puede usar junto con la palabra clave estática.

3) ¿Qué es la serialización y dónde se usa? La serialización es el proceso de hacer que el estado del objeto sea persistente. Eso significa que el estado del objeto se convierte en un flujo de bytes para ser utilizado para persistir (por ejemplo, almacenar bytes en un archivo) o transferir (por ejemplo, enviar bytes a través de una red). Del mismo modo, podemos usar la deserialización para recuperar el estado del objeto desde bytes. Este es uno de los conceptos importantes en la programación de Java porque la serialización se usa principalmente en la programación de redes. Los objetos que deben transmitirse a través de la red deben convertirse en bytes. Antes de comprender la palabra clave transitoria, uno debe comprender el concepto de serialización. Si el lector sabe acerca de la serialización, omita el primer punto.

Nota 1) Transitorio se utiliza principalmente para el proceso de serialización. Para eso, la clase debe implementar la interfaz java.io.Serializable. Todos los campos de la clase deben ser serializables. Si un campo no es serializable, debe marcarse como transitorio.

Nota 2) Cuando se lleva a cabo un proceso deserializado, se establecen en el valor predeterminado: cero, falso o nulo según la restricción de tipo.

Nota 3) ¿Palabra clave transitoria y su propósito? Un campo que se declara con un modificador transitorio no participará en el proceso serializado. Cuando un objeto se serializa (se guarda en cualquier estado), los valores de sus campos transitorios se ignoran en la representación en serie, mientras que los campos que no sean transitorios tomarán parte en el proceso de serialización. Ese es el propósito principal de la palabra clave transitoria.

Vishal Sheth
fuente