这是一种稍弱的同步机制,用来确保将变量的更新操作通知到其他线程,保持被该字段修饰的变量在线程之间的共享.并且编译器注意到被修饰的变量,那么不会将该变量上的操作同其他内存操作一起重排序.volatile变量不会被缓存在寄存器或者其他处理器不可见的地方,因此在读取volatile类型的变量的时候总会返回最新写入的值.
这里有个错误的引用场景,就是count++,这种类型的操作用volatile修饰,当多个线程在同时执行count++的时候,它是依赖count的当前值的,多个线程可以同时获取count值,但是在加的时候,它的修改不具备原子性,即获取值,修改值,写入内存这三步不是原子性的,所以计数器用该关键字修饰,还是会出现问题,一般适用于单线程修改,多线程读取的场景.
在代码运行中,为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完不知道何时会写到内存。如果对声明volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。所以,在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行操作的时候,会重新从系统内存中把数据读到处理器缓存里