Diferencia entre palabras clave volátiles y transitorias en Java

Como cualquier otro lenguaje de programación, Java tiene un conjunto de palabras clave que están reservadas y tienen un significado especial. En este artículo, veremos la diferencia entre las palabras clave volátil y transitorio. 

Antes de entrar en las diferencias, primero comprendamos qué significa realmente cada uno de ellos.

Volátil :

La palabra clave volátil se usa para marcar la JVM y el subproceso para leer su valor de la memoria principal y no utilizar el valor almacenado en caché presente en la pila de subprocesos. Se utiliza en programación concurrente en java.

Java

class GFG extends Thread {
  
    // using volatile
    volatile boolean working = true;
  
    // if non-volatile it will
    // sleep in main and
    // runtime error will coocur
    public void run()
    {
        long count = 0;
        while (working) {
            count++;
        }
  
        System.out.println("Thread terminated."
                           + count);
    }
  
    // Driver code
    public static void main(String[] args)
        throws InterruptedException
    {
        GFG test = new GFG();
        test.start();
        Thread.sleep(100);
        System.out.println("After Sleeping in Main");
        test.working = false;
        test.join();
        System.out.println("Working set to "
                           + test.working);
    }
}

Producción:  

Salida de código volátil

Transitorio :

La palabra clave Transient se usa con la variable de instancia para eliminarla del proceso de serialización. Durante la serialización, el valor del campo transitorio o variable no se guarda.

Java

import java.io.*;
  
class Test implements Serializable {
  
    // Making Accesskey transient for security
    transient String accessKey;
  
    // Making age transient as age can be
    // calculated from Date of Birth
    // and current date.
    transient int age;
  
    // serialize other fields
    String name, address;
    public Test(String accessKey, int age,
                String name, String address)
    {
        this.accessKey = accessKey;
        this.age = age;
        this.name = name;
        this.address = address;
    }
}
  
public class GFG {
    public static void main(String[] args)
        throws Exception
    {
        ObjectInputStream in
            = new ObjectInputStream(
                (new FileInputStream(
                    "login_details.txt")));
        Test obj = (Test)in.readObject();
  
        /* Transient variable will be shown 
        null due to security reasons.*/
        System.out.println("Accesskey: "
                           + obj.accessKey);
        System.out.println("Age: "
                           + obj.age);
        System.out.println("Name: "
                           + obj.name);
        System.out.println("Address: "
                           + obj.address);
    }
}

Producción:

Salida de código transitorio

La siguiente tabla describe las diferencias:

Transitorio Volátil
La variable transitoria marcada impide que se serialice. La variable marcada como Volátil sigue la relación anterior a la visibilidad en el programa Java de subprocesos múltiples, lo que reduce el riesgo de errores de consistencia de la memoria.
Brinda control y flexibilidad para excluir algunos métodos de objetos del proceso de serialización. Evita que JVM realice reordenaciones, lo que podría comprometer la sincronización. 
Durante la deserialización, se inicializan con un valor predeterminado.  No se inicializan con un valor predeterminado.
No se puede usar con la palabra clave estática ya que la variable estática no pertenece a una instancia individual. Durante la serialización, solo se trata del estado actual del objeto.  Se puede utilizar con la palabra clave estática.
No se puede utilizar con la palabra clave final. Aunque JVM no se queja de eso, pero durante la deserialización uno enfrentará el problema de reinicializar una variable.  Se puede utilizar con la palabra clave final.

Publicación traducida automáticamente

Artículo escrito por shivamraj74 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *