volatile关键字是一种比synchronized更轻量级的同步方法,它提供了一种免锁机制。与synchronized相比,volatile可以保证可见性、有序性,但不能保证原子性,所以只有在一些对原子性没有要求的场合才可以用volatile代替synchronized。
可见性:普通情况下线程读数据时把数据从内存读到自己的缓存区,以后可能会直接从缓存区读取,而不经过内存,写数据时也是先写入缓存区,然后再写入内存。而在可见性情况下,线程写数据时会将数据直接写入内存,同时通知其他线程把缓存区中的该数据作废,让它们去内存中重新读取数据,这样就保证了数据的更新对其他线程是可见的。
有序性:指令优化时可能会把一些指令的顺序改变,这样有可能造成线程的执行结果出现异常,如果把一个变量声明为volatile,那么在这条语句之前的语句不会在它之后执行,在这条语句之后的语句也不会在它之前进行,保证了有序性。
原子性:例如i++操作,如果不是原子性的话,两个线程同时进行i++,可能最后的结果不是 i+2,而是i+1,因为两个线程读到的值可能是一样的。所以volatile只能在对原子性没有要求的情况下使用:(1)对变量的写操作不依赖于当前值;(2)该变量没有包含在其他变量的不变式中。可以认为除了赋值之外不对该变量做其他操作。