以下内容整理自互联网,仅用于个人学习
transient
作用:加了该关键字的属性,不会被序列化。
换句话说,这个字段仅存于调用者内存,而不会写到磁盘里持久化。
序列化原理:将待序列化的对象中的信息写入到磁盘或网络流中。序列化中的引用会进行“深度复制”,并且如果两个对象有共同的引用对象,且两个对象都写入同一个流,那么该引用对象不会重复创建,只会创建一次,并还原到虚拟机后引用的还是同一个对象。但是,如果写入不同的流中,那么两次创建的是完全不同还原对象。
volatile
volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。
每个线程访问堆中对象时,将堆中对象load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆变量值有任何关系,而是直接修改副本变量值。
修改完之后,自动把线程变量副本的值写到对象在堆变量中。这样堆中对象的值就产生了变化。这些操作不是原子性的。
使用volatile修饰变量,JVM只是保证从内存加载到线程工作内存中的值是最新的。因此,即使使volatile还是会存在并发情况。
当且仅当满足以下所有条件时,才应该使用volatile变量:
- 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
- 该变量没有包含在具有其他变量的不变式中。