volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile是用来解决可见性的,Java在处理多线程任务时,每个线程都会有一个栈空间储存本线程的变量,若存在一个共享变量在共享内存,线程A改变了该变量的值,但是共享内存(主内存)没有及时更新,线程B在使用时就会继续使用旧值。
因此在变量前使用volatile修饰,就可以保证共享内存会及时更新变量值,这就是可见性。
可见性的特性可以总结为以下两点:
对变量的写操作会立即更新到共享内存
对变量的读操作会读共享内存中的已经更新的值
注意:
volatile没有锁的特性,不能实现同步。
volatile的写操作有原子性,线程A写完(所有步骤都已经完成之后),才可以被线程B读取到。
写操作也有先后顺序,线程A写完线程B才可以写,说明并发写操作时没有问题的。
i++这种自增操作不是原子性的!可能存在不同线程同时读到同一个值,然后加1,就不会得到预期的结果。
体现:
多线程并发的时候,如果初始化一个对象,分配内存之后,初始化对象和将对象指向分配的内存这两个过程的顺序可能会出现交换,如果将对象指向分配的内存的过程完成但是没有来得及初始化对象的时候,内存刷新,线程将会得到一个未初始化的对象,此时可以使用volatile来修饰就可以避免此类现象的发生,所有步骤都会按顺序进行。



