`
- 浏览:
21683 次
- 性别:
- 来自:
深圳
-
volatile 和 serialVersionUID
volatile(不稳定的)
volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
serialVersionUID
在序列化对象的时候,JVM会默认生成一个 serialVersionUID, 如果一个类后来的版本发生了变化,比如说,添加了一个字段,那么反序列旧版本的对象比较 serialVersionUID 时会发生错误。如果编程时强制指定了serialVersionUID, 那么序列化时会使用这个UID,反序列化时也用它,这样就不会出错了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
实现`Serializable`接口,配合使用特殊序列化方法,以及妥善管理`serialVersionUID`,可以有效地控制和优化对象的序列化过程。这对于数据持久化、网络通信以及分布式系统中的对象交换都有着至关重要的作用。
在Java编程语言中,`Serializable`接口是一个非常重要的概念,它是用来实现对象序列化和反序列化的机制。对象序列化是将对象的状态信息转换为可以存储或传输的形式的过程,而反序列化则是相反的过程,即将数据从序列...
在进行反序列化时,Java会验证`serialVersionUID`,确保对象在序列化和反序列化之间的一致性。 2. JSON:通过将对象转换为JSON字符串进行传输,JSON格式通用且易于阅读,支持多种编程语言。 3. ProtoBuf:Google开源...
同时,`volatile`字段在序列化和反序列化过程中可能会失去其特性,因此需要注意处理。 除此之外,还有其他的序列化库和框架,比如Google的Protocol Buffers、Apache Avro和JSON序列化库Jackson等。这些库提供了更...
2. **transient和volatile关键字**:`transient`关键字用于标记不会被序列化的字段,而`volatile`关键字与序列化无关,但会影响到变量的可见性和同步性。 3. **序列化流的安全性**:序列化可能会暴露对象的内部状态...
3. **transient和volatile关键字**:`transient`关键字用于标记那些不应该序列化的成员变量,它们在序列化过程中会被忽略。`volatile`关键字则与线程同步有关,序列化时不特别处理,但需要注意的是,序列化不保证...
关于序列化,文档探讨了如何实现Java对象的序列化和反序列化,以及为什么实现了Serializable接口的对象能够被序列化,包括默认序列化机制、SerialVersionUID的作用,以及序列化的影响因素和常见第三方库。...
2. **transient和volatile关键字**:`transient`修饰的字段不会被序列化,而`volatile`关键字与此无关,它用于保证变量的可见性和同步性。 3. **序列化流的安全性**:序列化的数据可以被恶意用户篡改,因此,敏感...
`volatile`关键字的字段也会被忽略,但这是因为它与多线程同步有关,而不是序列化。 Java序列化还涉及到版本控制问题,即`serialVersionUID`。每个可序列化的类都有一个与此类相关的唯一标识符,用于版本控制。当类...
private static final long serialVersionUID = 1L; private transient int a; // 不参与序列化 private int b; // 参与序列化 public TransientExample(int a, int b) { this.a = a; this.b = b; } } ...
本文将对几个常见的Java修饰符进行详细介绍,包括`public`、`private`、`protected`以及一些其他修饰符如`abstract`、`final`、`static`、`volatile`和`transient`等。 #### 1. `public` `public`修饰符是最常用的...
这里的`volatile`关键字确保了多线程环境下的可见性和有序性,避免了指令重排序问题,保证了单例的正确性。 然而,单例模式在面对类加载器和序列化时仍存在挑战。如果类加载器不同,它们各自可以加载类的一个副本,...
- **`SerialVersionUID`的作用**:标识类的不同版本,在反序列化过程中用来验证序列化对象和当前类版本的一致性。 - **影响序列化**:若类的结构发生变化(如添加/删除字段),则需更新`serialVersionUID`值,避免...
5. **transient和volatile关键字** - `transient` 关键字可以标记字段,表示这个字段不应该参与序列化过程,即不会被序列化到字节流中。 - `volatile` 关键字与序列化无关,但通常与多线程同步有关,序列化时不会...
Java中的transient和volatile变量有什么区别? 提及同步块的用途 基于散列的集合中加载因子的默认大小是多少? 编写代码使集合只读? 区分谓词和函数? Java8中的Nashorn是什么? JVM 分配了多少种内存区域? 定义为...
2. **序列化版本ID**:`serialVersionUID`,用于版本控制,当类的结构发生变化时,应保持该ID的值与序列化时一致,否则可能导致反序列化失败。 3. **标记为transient的字段**:不会被序列化,因为它们是非持久化的。...
private static final long serialVersionUID = 1L; private static final SerializableSingleton INSTANCE = new SerializableSingleton(); private SerializableSingleton() {} public static ...
在Android Studio 3.0.1的环境下,开发者可以利用这些单例模式进行项目开发,优化代码结构,提高代码的可维护性和效率。同时,理解并掌握单例模式的实现方式及其在特定环境下的注意事项,是每个Android开发者必备的...
5. ** transient 和 volatile 关键字**:transient关键字用于标记那些不应该在序列化过程中保存的成员变量。而volatile关键字与序列化无关,但它确保了多线程环境下的可见性和有序性。 6. **自定义序列化和反序列化...
- **`SerialVersionUID`的作用**:序列化ID用于验证序列化对象的版本一致性,如果在序列化和反序列化过程中`SerialVersionUID`不匹配,则会导致`InvalidClassException`异常。 - **影响序列化的因素**:包括对象的...