有人能解释一下 transient和 volatile修饰符在 Java 中是什么意思吗?
transient
volatile
易失性意味着其他线程可以编辑这个特定的变量,因此编译器允许访问这些变量。
Http://www.javamex.com/tutorials/synchronization_volatile.shtml
瞬态意味着当序列化对象时,它将在反序列化时返回其默认值
Http://www.geekinterview.com/question_details/2
volatile和 transient修饰符可以应用于类 1的字段,而不管字段类型如何。除此之外,它们毫无关联。
transient修饰符告诉 Java 对象序列化子系统在序列化类的实例时排除该字段。然后反序列化对象时,字段将初始化为默认值; 即,引用类型为 null,基元类型为零或 false。请注意,JLS (参见 8.3.1.3)没有说明 transient的含义,而是遵从 Java 对象序列化规范。其他序列化机制 梅注意字段的 transient-ness。或者他们可能会忽略它。
null
false
(注意,JLS 允许将 static字段声明为 transient。这种组合对 Java 对象序列化没有意义,因为它无论如何都不会序列化静态数据。然而,在其它情况下,这种做法也可能有意义,因此,我们有理由不完全禁止这种做法。)
static
volatile修饰符告诉 JVM,对字段的写操作应该始终同步刷新到内存中,对字段的读操作应该始终从 memy2中读取。这意味着在多线程应用程序中,可以安全地访问和更新标记为 volatile 的字段,而无需使用本机或标准的基于库的同步。类似地,对易失性字段的读写是原子的。(这不适用于 > > 非易失性 < < long或 double字段,这些字段在某些 JVM 上可能会受到“单词撕裂”的影响。)JLS 的相关部分是 8.3.1.4、 17.4和 17.7。
long
double
但不是局部变量或参数。 这种解释是有意的非正式和简化。例如,非易失性写操作在易失性写操作之前发生,这对非易失性写操作的可见性还有其他影响。有关 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
暂住:
首先需要知道它在哪里需要它如何桥梁的差距。
1) Access 修饰符瞬态只适用于可变组件。 它将不与方法或类一起使用。
2)瞬态关键字不能与静态关键字一起使用。
3)什么是序列化,在哪里使用序列化? 序列化是使对象的状态持久化的过程。这意味着对象的状态被转换为字节流,用于持久化(例如在文件中存储字节)或传输(例如通过网络发送字节)。同样,我们可以使用反序列化从字节返回对象的状态。这是 Java 编程中的一个重要概念,因为串行化主要用于网络编程。需要通过网络传输的对象必须转换成字节。 在理解瞬态关键字之前,必须了解序列化的概念。如果读者知道序列化,请跳过第一点。
注1)瞬态过程主要用于序列化过程。 为此,该类必须实现 java.io.Serializer 接口。 类中的所有字段都必须是可序列化的。如果字段不可序列化,则必须将其标记为瞬态。
注意2)当反序列化过程发生时,它们被设置为默认值-根据类型约束为0、 false 或 null。
注3)瞬态关键字及其用途? 使用暂时修饰符声明的字段不会参与序列化过程。 当一个对象被序列化(以任何状态保存)时,其暂态字段的值在序列表示中被忽略,而暂态字段以外的字段将参与序列化过程。这是瞬态关键字的主要用途。