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

Разница между volatile и transient в Java

Ключевое слово volatile используется в многопоточных средах, где две нити одновременно читают и пишут на одну и ту же переменную. Ключевое слово volatile напрямую обновляет изменения в основную память, а не в кэш CPU. 

С другой стороны, в процессе сериализации используется ключевое слово transient. Поля, помеченные как transient, не могут быть частью сериализации и десериализации. Мы не хотим сохранять значения任何一个 переменной, поэтому мы используем ключевое слово transient вместе с этой переменной. 

НомерКлючЛегковоспламеняющиесяКратковременные
1
Основные 
Ключевое слово volatile используется для прямого обновления изменений в основную память
Ключевое слово transient используется для исключения переменных из сериализации 
2.
Значения по умолчанию 
Вolatile не использует значения по умолчанию для инициализации.
Во время десериализации будут использоваться значения по умолчанию для инициализации транзитных переменных 
3
Статический 
Вolatile может использоваться с статическими переменными.
Временно не может использоваться с ключевым словом static
4
В конце 
Моментальный может использоваться с ключевым словом final
Моментальный не может использоваться с ключевым словом final

Пример моментального

//A sample class that uses transient keyword to
//Skip serialization.
class TransientExample implements Serializable {
   transient int age;
   //Serialize other fields
   private String name;
   private String address;
   //Other code
{}

Пример вещества

class VolatileExmaple extends Thread{
   boolean volatile isRunning = true;
   public void run() {
      long count = 0;
      while (isRunning) {
         count++;
      {}
      System.out.println("Thread terminated. " + 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);
   {}
{}
Давайте посмотрим, что вам понравится