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

Javaのvolatileとtransientの違い

多线程環境で使用されるvolatileキーワードは、2つのスレッドが同時に同じ変数を読み書きする場合に使用されます。volatileキーワードは変更を直接メインメモリに反映させ、CPUキャッシュに反映させるのではなく、直接メインメモリに反映させます。 

一方、シリアライズプロセスではtransientキーワードを使用しています。瞬間的にマークされたフィールドはシリアライズやデシリアライズの一部にはなりません。何も変数の値を保存したくない場合は、その変数と瞬間的なキーワードを一緒に使用します。 

番号キー易失性の一時的な
1
基本的な 
変更を直接メインメモリに反映させるためにVolatileキーワードを使用します
シリアライズ中に変数を除外するために一時的なキーワードを使用します 
2。
デフォルト値 
揮発性はデフォルト値で初期化しません。
反序列化中に、デフォルト値で瞬間変数を初期化します 
3
静的 
可変性は静的変数と一緒に使用できます。
一時的にstaticキーワードと一緒に使用できません
4
最後に 
finalキーワードと一緒に使用できます
瞬間はfinalキーワードと一緒に使用できません

瞬間例

// 瞬間キーワードを使用するサンプルクラス
//シリアライズをスキップ。
class TransientExample implements Serializable {
   transient int age;
   //他のフィールドのシリアライズ
   private String name;
   private String address;
   //他のコード
}

揮発物の例

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);
   }
}