问题
有人能解释一下transient
和volatile
修饰符在Java中的含义吗?
#1 热门回答(130 赞)
volatile
和transient
修饰符适用于类的字段。
transient
modifier告诉Java对象序列化子系统在序列化类的实例时排除字段。然后反序列化对象时,该字段将初始化为默认值; ienull
为引用类型,0或8161638507为原始类型。请注意,JLS(参见8.3.1.3)并未说明什么是transient
,但是请参考Java Object Serialization Specification。其他非标准序列化机制也可能会关注字段的transient
-ness。
volatile
modifier告诉JVM写入字段应始终同步刷新到内存,并且该字段的读取应始终从内存中读取。这意味着可以在多线程应用程序中安全地访问和更新标记为volatile的字段,而无需使用本机或基于库的同步。同样,对volatile字段的读写也是原子的。 (这并不适用于>>非易失性<< long
ordouble
fields,这可能会受到在某些JVM上"字撕裂"。)的JLS are8.3.1.4,17.4and17.7的相关部分。
#2 热门回答(8 赞)
易失性意味着其他线程可以编辑该特定变量。因此编译器允许访问它们。
http://www.javamex.com/tutorials/synchronization_volatile.shtml
瞬态意味着在序列化对象时,它将在反序列化时返回其默认值
http://www.geekinterview.com/question_details/2
#3 热门回答(4 赞)
易变和瞬态关键词
1)transient关键字与实例变量一起使用,以将它们从序列化过程中排除。如果字段是暂时的,则其值将不会保留。
另一方面,volatile关键字用于将Java变量标记为"存储在主存储器中"。
每次读取volatile变量都将从计算机的主内存中读取,而不是从CPU缓存中读取,并且每次写入volatile变量都将写入主内存,而不仅仅是CPU缓存。
2)transient关键字不能与static关键字一起使用,但volatile可以与static一起使用。
3)在反序列化期间使用默认值初始化瞬态变量,并且必须由应用程序代码处理值的赋值或恢复。
有关更多信息,请参阅我的博客:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html