¿Alguien puede explicar qué significan los modificadores transient
y volatile
en Java?
¿Alguien puede explicar qué significan los modificadores transient
y volatile
en Java?
Respuestas:
Los modificadores volatile
y transient
se pueden aplicar a los campos de las clases 1 independientemente del tipo de campo. Aparte de eso, no están relacionados.
El transient
modificador 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 (ver 8.3.1.3 ) no dice qué transient
significa, sino que difiere de la Especificación de serialización de objetos Java . Otros mecanismos de serialización pueden prestar atención a la transient
intensidad de un campo . O pueden ignorarlo.
(Tenga en cuenta que el JLS permite que un static
campo 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 volatile
modificador 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 << long
o double
campos, 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.
volatile
y transient
palabras clave
1) la transient
palabra clave se usa junto con las variables de instancia para excluirlas del proceso de serialización. Si un campo es transient
su valor no se conservará.
Por otro lado, la volatile
palabra clave se usa para marcar una variable Java como "almacenada en la memoria principal".
Cada lectura de una volatile
variable se leerá desde la memoria principal de la computadora, y no desde la memoria caché de la CPU, y cada escritura en una volatile
variable se escribirá en la memoria principal, y no solo en la memoria caché de la CPU.
2) la transient
palabra clave no se puede usar junto con la static
palabra clave pero volatile
se puede usar junto con static
.
3) las transient
variables 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
transient
variable no se puede usar junto con la static
palabra 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
static
y se transient
deben usar juntos. El problema es que tiene poco sentido, porque los mecanismos de serialización típicos no persisten estáticos de todos modos.
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
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.