有人可以解释一下transient
andvolatile
修饰符在 Java 中的含义吗?
4 回答
volatile
andtransient
修饰符可以应用于类1的字段,而与字段类型无关。除此之外,它们是无关的。
修饰符告诉 Java 对象序列化子系统在transient
序列化类的实例时排除该字段。当对象被反序列化时,该字段将被初始化为默认值;即null
对于引用类型,零或false
对于原始类型。请注意,JLS(参见8.3.1.3)没有说明什么transient
意思,而是遵循Java Object Serialization Specification。其他序列化机制可能会关注字段的transient
-ness。或者他们可能会忽略它。
(请注意,JLS 允许将static
字段声明为transient
。这种组合对 Java 对象序列化没有意义,因为它无论如何都不会序列化静态。但是,它在其他上下文中可能有意义,因此有一些理由不是完全禁止。)
该volatile
修饰符告诉 JVM 对字段的写入应始终同步刷新到内存,并且对字段的读取应始终从内存中读取2。这意味着标记为 volatile 的字段可以在多线程应用程序中安全地访问和更新,而无需使用本机或基于标准库的同步。同样,对 volatile 字段的读取和写入也是原子性的。(这不适用于 >>non-volatile<<long
或double
字段,在某些 JVM 上可能会受到“单词撕裂”。) JLS 的相关部分是8.3.1.4、17.4和17.7。
1 - 但不是局部变量或参数。
2 - 这种解释是有意的非正式和简化的。例如,在易失性写入之前发生的非易失性写入的可见性还有其他含义。有关精确、正式和详细的volatile
语义规范,请参阅上面链接的 JLS 第 17 章(内存模型)参考资料。请注意,JMM 规范是针对建模行为的,并且不知道该行为是如何在平台级别实现的。
volatile
和transient
关键词
1)transient
关键字与实例变量一起使用以将它们从序列化过程中排除。如果一个字段是transient
它的值将不会被持久化。
另一方面,volatile
关键字用于将 Java 变量标记为“存储在主内存中”。
对变量的每次读取volatile
都将从计算机的主内存中读取,而不是从 CPU 缓存中读取,并且对volatile
变量的每次写入都将写入主内存,而不仅仅是 CPU 缓存。
2)transient
关键字不能和static
关键字一起使用,但volatile
可以和.一起使用static
。
3)transient
变量在反序列化过程中被初始化为默认值,并且值的赋值或恢复必须由应用程序代码处理。
有关更多信息,请参阅我的博客:http:
//javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
Volatile 意味着其他线程可以编辑该特定变量。所以编译器允许访问它们。
http://www.javamex.com/tutorials/synchronization_volatile.shtml
瞬态意味着当您序列化一个对象时,它将在反序列化时返回其默认值
短暂的 :
首先需要知道它在哪里需要它如何弥合差距。
1) 访问修饰符瞬态仅适用于可变组件。它不会与方法或类一起使用。
2) 瞬态关键字不能与静态关键字一起使用。
3)什么是序列化以及它在哪里使用?序列化是使对象的状态持久化的过程。这意味着对象的状态被转换为字节流以用于持久化(例如在文件中存储字节)或传输(例如通过网络发送字节)。同样,我们可以使用反序列化从字节中恢复对象的状态。这是 Java 编程中的重要概念之一,因为序列化主要用于网络编程。需要通过网络传输的对象必须转换为字节。在了解瞬态关键字之前,必须了解序列化的概念。如果读者了解序列化,请跳过第一点。
注 1) Transient 主要用于序列化过程。为此,该类必须实现 java.io.Serializable 接口。类中的所有字段都必须是可序列化的。如果字段不可序列化,则必须将其标记为瞬态。
注 2)当反序列化过程发生时,它们会根据类型约束设置为默认值 - 零、假或空。
注3)瞬态关键字及其用途?使用瞬态修饰符声明的字段将不参与序列化过程。当一个对象被序列化(以任何状态保存)时,其瞬态字段的值在序列表示中被忽略,而瞬态字段以外的字段将参与序列化过程。这就是瞬态关键字的主要目的。