文章目录
volatile内存定义
当写一个volatile变量时,JMM会将该线程写入到工作内存的值同步刷新到主内存中。
当读一个volatile变量时,JMM会将该线程工作内存中的值置为无效,直接从主内存中读取值并刷新到工作内存中。
特点
- 只能用来修饰变量
- 可以保证变量的可见性 ,也就是当这个变量修改后,所有线程都会被要求重新从主内存中再次拷贝一次该变量的值到工作空间中。主要是通过两个操作来保证共享变量的可见性:
1、被volatile关键词修饰的变量,当CPU处理完该数据将数据刷回高速缓存区时,会立马将数据刷回内存。
2、当被volatile关键词修饰的变量刷回内存时,立马让其他CPU中使用的该变量无效,在最开始时是采用在总线上添加LOCK#锁来做的,但该方式效率比较低,后续Intel将实现方式改为只要CPU在修改了被volatile修饰的共享变量后,就会向其他CPU发出信号,将读取到工作内存中的变量无效化,而其他CPU在需要使用这个变量时,如果检测到这个无效信号,就会重新从主内存中再次读取一次该变量的值,从而保证了可见性。 - 同时该关键词还可以禁止指令重排,实现原理一个是在字节码层面添加了ACC_VOLATILE关键词保证,另一个是在JVM中通过插入内存屏障来保证,内存屏障就是保证前者执行完之后才执行后者,有点类似依赖关系,有LOADLOAD、LOADSTORE、STORELOAD、STORESTORE四种情况。
LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2, 在L