怎么理解 volatile 什么时候会用到 volatile多线程环境共享变量读写多线程 只读共享变量 不需要多线程 写共享变量只要求可见性 volatile ✓多线程 写共享变量要求原子性 synchronized / AtomicXxx单线程 不需要volatile 关键字的来源来源是因为有分级缓存CPU缓存速度大于主内存缓存多线程环境下每个线程变量读写都是从主存先拷贝到线程自己的缓存中然后再同步到主存这个时候不同线程里对于同一个全局变量的值可能不一样对于主存和CPU缓存变量的存储有三种方案只改CPU缓存速记本不修改主存图书馆每次修改CPU缓存都修改主存回刷【性能差】修改CPU缓存后合适的时候回刷主存【折中方案这就是 CPU 和编译器的默认策略不保证立刻刷回但最终会刷回什么时候刷由 CPU 和 JVM 决定Java 默认用这种方式】volatile的场景可见性比如主存和线程都在执行定时任务但是都依赖的全局变量 flag如果主存 flag true 改成了 false线程里有可能会读取不到导致线程定时任务一直在执行停不下来 while(flag)也就是说主存和CPU缓存之间是双向的如果需要同步就需要volatile关键词其他volatile 不保证原子性如果需要原子性需要读写同步的话需要 synchronized 关键词volatile 能够防止指令重排