Java 什么是瞬态和挥发性修改器?

Java 什么是瞬态和挥发性修改器?,java,serialization,storage,modifier,Java,Serialization,Storage,Modifier,有人能解释一下Java中的transient和volatile修饰符是什么意思吗?volatile意味着其他线程可以编辑该特定变量。因此编译器允许访问它们 瞬态意味着当序列化对象时,它将在反序列化时返回其默认值 无论字段类型如何,都可以将volatile和transient修饰符应用于类别1的字段。除此之外,它们是不相关的 transient修饰符告诉Java对象序列化子系统在序列化类的实例时排除该字段。当对象被反序列化时,字段将被初始化为默认值;i、 e.null表示引用类型,零或false

有人能解释一下Java中的
transient
volatile
修饰符是什么意思吗?

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

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


无论字段类型如何,都可以将
volatile
transient
修饰符应用于类别1的字段。除此之外,它们是不相关的

transient
修饰符告诉Java对象序列化子系统在序列化类的实例时排除该字段。当对象被反序列化时,字段将被初始化为默认值;i、 e.
null
表示引用类型,零或
false
表示基元类型。请注意,JLS(请参阅)没有说明“瞬态”的含义,而是遵从“瞬态”。其他序列化机制可能会注意字段的
瞬时性。或者他们可能会忽略它

(请注意,JLS允许将
static
字段声明为
transient
。这种组合对于Java对象序列化没有意义,因为它无论如何都不会序列化static。但是,它在其他上下文中也有意义,因此不完全禁止它是有道理的。)


volatile
修饰符告诉JVM,对字段的写入应始终同步刷新到内存中,对字段的读取应始终从内存中读取。这意味着标记为volatile的字段可以在多线程应用程序中安全地访问和更新,而无需使用本机或基于标准库的同步。类似地,对易失性字段的读写也是原子的。(这不适用于>>非易失性
易失性
瞬态
关键字

1)
transient
关键字与实例变量一起使用,将它们从序列化过程中排除。如果一个字段是瞬态的,它的值将不会持久化

另一方面,
volatile
关键字用于将Java变量标记为“存储在主内存中”

volatile
变量的每次读取都将从计算机的主存中读取,而不是从CPU缓存中读取,对
volatile
变量的每次写入都将写入主存,而不仅仅是CPU缓存

2)
transient
关键字不能与
static
关键字一起使用,但是
volatile
可以与
static
一起使用

3)
瞬态
变量在反序列化期间使用默认值初始化,并且必须由应用程序代码处理赋值或恢复值

有关更多信息,请参阅我的博客:
瞬态:

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

1) 访问修改器瞬态仅适用于可变组件。 它不会与方法或类一起使用

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

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

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

注2)当发生反序列化过程时,根据类型约束将其设置为默认值-零、假或空

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

“因此编译器允许访问它们。”您的句子表明线程在默认情况下没有访问权限。现在我阅读了链接和我理解的另一个答案:编译器没有对变量进行任何特定于线程的中间存储,这样其他线程就可以在中间看到更改。我对volatile的C用法和volatile的java用法感到困惑。我的意思是编译器确保它可以访问字段的actaul值,而不是缓存值。这显然不是问题,这是重复的(这就是我投票关闭的原因)。参见示例和(以及其他许多)。这一问题的可能重复是一个非常有效的问题,相当于:
transient
变量不能与
static
关键字一起使用的原因是静态变量属于一个类,而不属于任何单个实例。序列化的概念与对象的当前状态有关。只有与类的特定实例相关联的数据才被序列化,因此在序列化过程中静态成员字段被忽略实际上,JLS允许同时使用
static
transient
。问题是它没有什么意义,因为