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

Vij*_*wal 119 java

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

Ste*_*n C 146

volatiletransient改性剂可以被施加到的类的字段1,不论字段类型.除此之外,他们是无关的.

transient修饰符告诉Java对象序列化子系统序列化类的实例时排除领域.然后反序列化对象时,该字段将初始化为默认值; 即,null对于引用类型,零或false原始类型.请注意,JLS(参见8.3.1.3)没有说明是什么transient意思,而是遵循Java对象序列化规范.其他序列化机制可能会关注字段的性transient.或者他们可能会忽略它.

(注意,JLS允许将static字段声明为transient.这种组合对Java对象序列化没有意义,因为它无论如何都不会序列化静态.但是,它在其他上下文中是有意义的,所以有一些理由可以不要完全禁止它.)

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


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


Ray*_*nos 8

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

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

瞬态意味着在序列化对象时,它将在反序列化时返回其默认值

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

  • "因此编译器允许访问它们." 你的句子表明线程默认没有访问权限.现在我读了链接和我理解的另一个答案:编译器不做任何类型的线程特定的变量中间存储,所以其他线程可以看到中断的变化. (5认同)

小智 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

  • `transient` 变量不能与 `static` 关键字一起使用的原因是静态变量属于一个类而不是任何单个实例。序列化的概念与对象的当前状态有关。只有与类的特定实例关联的数据才会被序列化,因此在序列化过程中会忽略静态成员字段 (2认同)