Java中volatile和transient的区别


volatile关键字用于多线程环境中,多个线程同时读写同一个变量。volatile关键字将更改直接刷新到主内存,而不是CPU缓存。

另一方面,transient关键字用于序列化。标记为transient的字段不能成为序列化和反序列化的部分。如果我们不想保存任何变量的值,则可以使用transient关键字修饰该变量。

序号关键字VolatileTransient
1
基础
volatile关键字用于将更改直接刷新到主内存
transient关键字用于在序列化过程中排除变量
2.
默认值
volatile变量不会初始化为默认值。
在反序列化期间,transient变量将初始化为默认值
3
静态
volatile可以与静态变量一起使用。
transient不能与static关键字一起使用
4
final
volatile可以与final关键字一起使用
transient不能与final关键字一起使用

Transient示例

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

Volatile示例

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

更新于:2019年11月18日

9K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告