English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Diferencia entre volatile y transient en Java

La palabra clave volatile se utiliza en entornos de múltiples hilos, donde dos hilos leen y escriben en la misma variable simultáneamente. La palabra clave volatile refresca cambios directamente en la memoria principal, en lugar de en la caché de CPU. 

Por otro lado, se utiliza la palabra clave transient durante el proceso de serialización. Los campos marcados como transitorios no pueden formar parte de la serialización y deserialización. No queremos guardar el valor de ninguna variable, por lo que utilizamos la palabra clave transient junto con esa variable. 

Número de secuenciaClaveVolátilMomentáneo
1
Básico 
La palabra clave Volatile se utiliza para refrescar cambios directamente en la memoria principal
Las palabras clave transitorias se utilizan para excluir variables durante la serialización 
2。
Valores por defecto 
La volatilidad no inicializa con valores por defecto.
Durante la deserialización, se inicializarán las variables transitorias con valores por defecto 
3
Estática 
La volatilidad se puede usar junto con variables estáticas.
No se puede usar junto con la palabra clave static temporalmente
4
Finalmente 
Se puede usar junto con la palabra clave final
La transitoriedad no se puede usar junto con la palabra clave final

Ejemplo de transitorio

// Una clase de ejemplo que utiliza la palabra clave transient para
//Saltar su serialización.
class TransientExample implements Serializable {
   transient int age;
   //Serializar otros campos
   private String name;
   private String address;
   //Otro código
}

Ejemplo de volátil

class VolatileExmaple extends Thread{
   boolean volatile isRunning = true;
   public void run() {
      long count=0;
      while (isRunning) {
         count++;
      }
      System.out.println("线程终止。" + count);
   }
   public static void main(String[] args) throws InterruptedException {
      VolatileExmaple t = new VolatileExmaple();
      t.start();
      Thread.sleep(2000);
      t.isRunning = false;
      t.join();
      System.out.println("isRunning set to " + t.isRunning);
   }
}