volatie
1. 保证线程间变量的可见性
当变量在线程a中被修改后,其它线程工作内存中该变量的值可以立即得知改变(使得变量的修改被安全地同步到主内存中,同时使得其他线程的工作内存中对该变量的缓存失效;这样的话,其它线程必须重新去主内存中获取变量的最新值,即表现为对其它线程立即可见)
2. 禁止指令重排序
JVM指令重排序在单线程情况下不会出现问题(线程内表现串行的语义)。volatile关键字修饰的变量,生成字节码后会在变量前后生成内存屏障,指令重排时,不能把内存屏障后面的代码排到前面执行
3. 不能保证原子性
线程a读取了i=0的值,正在执行+1操作,稍后会回写到主内存;线程b已完成读取操作(不会再去主内存中取值),也在执行+1操作,等线程b执行完并回写到主内存后,i的值仍然是1。【原子操作需使用Atomic类】