有人能解释一下EDCOX1 0和EDCOX1 1修饰语在Java中意味着什么吗?
- 这显然不是一个问题,无论如何这是一个复制品(这就是我投票结束的原因)。例如,为什么Java有瞬态变量?什么时候使用Java中的易失性关键字?(还有其他许多人)。
- 可能是"易失性"的重复?
- 这是一个完全有效的问题,相当于:stackoverflow.com/questions/215497/…
volatile和transient修饰符可以应用于类1的字段,而不考虑字段类型。除此之外,它们是无关的。
EDCOX1×1修改器告诉Java对象序列化子系统在序列化类的实例时排除该字段。然后反序列化对象时,字段将初始化为默认值;即,引用类型的null,基元类型的false为零。注意,JLS(参见83.1.3)没有说明EDCOX1×1的含义,而是遵从Java对象序列化规范。其他序列化机制可能会注意字段的transient性。或者他们可以忽略它。
(请注意,jls允许将static字段声明为transient。这种组合对于Java对象序列化没有意义,因为它无论如何都不会序列化静态。然而,在其他情况下,这是有意义的,所以有一些理由不直接禁止它。)
volatile修饰符告诉jvm,对字段的写入应该总是同步刷新到内存中,对字段的读取应该总是从内存中读取。这意味着标记为volatile的字段可以在多线程应用程序中安全地访问和更新,而无需使用本机或基于标准库的同步。同样,对易失性字段的读和写也是原子的。(这不适用于>>非易失性<<long或double字段,在某些JVM上可能会出现"单词撕裂")JLS的相关部分为8.3.1.4、17.4和17.7。
1-但不适用于局部变量或参数。
volatile和transient关键字
1)transient关键字与实例变量一起使用,将它们从序列化过程中排除。如果字段是transient,则其值将不会持久化。
另一方面,EDCOX1×0×关键字用于将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关键字一起使用的原因是静态变量属于一个类而不是任何单个实例。序列化的概念与对象的当前状态有关。只序列化与类的特定实例关联的数据,因此在序列化期间将忽略静态成员字段。
- 实际上,jls允许static和transient一起使用。问题是它毫无意义,因为典型的序列化机制无论如何都不会保持静态。
volatile意味着其他线程可以编辑该特定变量。所以编译器允许访问它们。
http://www.javamex.com/tutorials/synchronization_volatile.shtml
瞬态意味着当您序列化一个对象时,它将在反序列化时返回其默认值。
http://www.geekinterview.com/questionu详细信息/2
- "所以编译器允许访问它们。"您的句子建议线程在默认情况下不具有访问权限。现在我阅读了链接和我理解的另一个答案:编译器不做任何类型的线程特定的变量中间存储,这样其他线程就可以间接地看到更改。
- 我得到了C使用的易失性和Java使用的易失性。我的意思是编译器确保它可以访问字段的actaul值,而不是缓存值。
- 这不仅仅意味着。