Java定义了两类有趣的修饰符:transient和volatile,这些修饰符用来处理特殊的情况。如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。例如:
class T {
transient int a; // will not persist
int b; // will persist
}
这里,如果T类的一个对象被写入一个持久的存储区域,a的内容不被保存,但b将被保存。
Volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。一种这样的情形是多线程程序。在多线程程序里,有时两个或更多的线程共享一个相同的实例变量。考虑效率的问题,每个线程可以自己保存该共享变量的私有拷贝。实际的变量副本在不同的时候更新,例如当进入synchronized方法时。
当这种方式运行良好时,它在时间上会是低效的。在某些情况,真正要紧的是变量主副本的值会体现当前的状态。
为保证这点,仅需把变量定义成volatile型,它告诉编译器它必须总是使用volatile变量的主副本(或者至少总是保持一些私有的最新的主副本的拷贝,反之亦然),同时,对主变量的获取必须以简洁次序执行,就像执行私有拷贝一样。