什么是瞬态和挥发性改性剂?

时间:2010-08-23 05:20:38

标签: java

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

4 个答案:

答案 0 :(得分:141)

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

transient修饰符告诉Java对象序列化子系统在序列化类的实例时排除该字段。然后反序列化对象时,该字段将初始化为默认值;即null表示引用类型,0或false表示原始类型。请注意,JLS(请参阅8.3.1.3)并未说明transient的含义,而是遵循Java Object Serialization Specification。其他序列化机制可能注意字段的transient - ness。或者他们可能会忽略它。

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

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


1 - 但不是局部变量或参数。

答案 1 :(得分:8)

易失性意味着其他线程可以编辑该特定变量。所以编译器允许访问它们。

http://www.javamex.com/tutorials/synchronization_volatile.shtml

瞬态意味着在序列化对象时,它将在反序列化

上返回其默认值

http://www.geekinterview.com/question_details/2

答案 2 :(得分:8)

volatiletransient个关键字

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

答案 3 :(得分:2)

瞬态:

首先需要知道它在哪里需要如何弥合差距。

1)Access修饰符瞬态仅适用于变量组件。 不会与方法或类一起使用。

2)瞬态关键字不能与静态关键字一起使用。

3)什么是序列化以及在何处使用? 序列化是使对象的状态持久化的过程。这意味着对象的状态将转换为字节流,用于持久化(例如,将字节存储在文件中)或传输(例如,通过网络发送字节)。同样,我们可以使用反序列化从字节中恢复对象的状态。这是Java编程中的重要概念之一,因为串行化主要用于网络编程中。需要通过网络传输的对象必须转换为字节。 在理解瞬时关键字之前,必须先了解序列化的概念。如果读者了解序列化,请跳过第一点。

注1)瞬变主要用于序列化过程。 为此,该类必须实现java.io.Serializable接口。 该类中的所有字段都必须可序列化。如果字段不可序列化,则必须将其标记为瞬态。

注2)进行反序列化处理时,它们将被设置为默认值-根据类型约束为零,false或null。

注3)瞬态关键字及其用途? 用瞬时修饰符声明的字段将不参与序列化过程。 当对象被序列化(以任何状态保存)时,其瞬时字段的值在串行表示中将被忽略,而瞬时字段以外的其他字段将参与序列化过程。这是瞬时关键字的主要目的。