什么是瞬态和易失性修饰符?

2022-08-31 08:20:15

有人可以解释一下 和 修饰符在 Java 中的含义吗?transientvolatile


答案 1

和 修饰符可应用于类1 的字段,而不考虑字段类型。除此之外,它们是无关的。volatiletransient

该修饰符告诉 Java 对象序列化子系统在序列化类的实例时排除该字段。当对象被反序列化时,该字段将被初始化为默认值;即 对于引用类型,对于零或基元类型。请注意,JLS(参见 8.3.1.3)没有说明含义,而是遵循 Java 对象序列化规范。其他序列化机制可能会关注字段的 -ness。或者他们可能会忽略它。transientnullfalsetransienttransient

(请注意,JLS 允许将字段声明为 。这种组合对于 Java 对象序列化没有意义,因为它无论如何都不会序列化静态。但是,它在其他情况下可能是有意义的,因此有理由不完全禁止它。statictransient

修饰符告诉 JVM,对字段的写入应始终同步刷新到内存,并且字段的读取应始终从内存2 读取。这意味着可以在多线程应用程序中安全地访问和更新标记为易失性的字段,而无需使用本机或基于标准库的同步。同样,对易失性场的读取和写入是原子的。(这不适用于>>非易失性<<或字段,这些字段在某些JVM上可能会受到“单词撕裂”的影响。JLS的相关部分是8.3.1.417.417.7volatilelongdouble


1 - 但不是局部变量或参数。
2 - 此解释是故意非正式和简化的。例如,在易失性写入之前发生的非易失性写入的可见性还有其他影响。请参阅上面链接的 JLS 第 17 章(内存模型)参考,了解易失性语义的精确、正式和详细的规范。请注意,JMM 规范是根据建模行为而言的,并且与如何在平台级别实现该行为无关。


答案 2

volatile和关键字transient

1) 关键字与实例变量一起使用,以将其从序列化过程中排除。如果字段是其值,则不会保留。transienttransient

另一方面,关键字用于将Java变量标记为“存储在主内存中”。volatile

变量的每次读取都将从计算机的主内存中读取,而不是从CPU缓存中读取,并且对变量的每次写入都将写入主内存,而不仅仅是CPU缓存。volatilevolatile

2) 关键字不能与关键字一起使用,但可以与 一起使用。transientstaticvolatilestatic

3)变量在反序列化期间使用默认值初始化,并且值的分配或恢复必须由应用程序代码处理。transient

有关更多信息,请参阅我的博客:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html