作用:
1. 共享变量在线程之间的可见性
2. 禁止指令重排序
具体实现方式:
1. 共享变量在线程之间的可见性
多线程的情况下,多个线程操作同一个共享变量的时候,是把共享变量复制一份,复制到自己的线程内存中,然后在私有线程里去操作自己单独的变量。等线程执行完毕的时候,会把私有线程中的变量复制到共享变量中,更新共享变量。
线程可见性指的是,当线程A复制了数据num,线程B也复制了数据num,这时候线程A对num赋值2,线程B看到的是num=2
具体实现为,volatile在进行写操作的时候,会对对应的变量增加写屏障,此时别的线程是无法对此变量进行读操作的,写的时候,是将数据写到当前的cpu缓存中,然后同步到主存中,此时同时会将其他cpu缓存中的值设置为无效,这时候如果别的线程如果要去读取值,就会发现cpu缓存中的值是无效的,那么就会去主存中读取。就会拿到最新的值。
2. 禁止指令重排序
在每个volatile写操作的前面插入一个StoreStore屏障,防止写volatile与后面的写操作重排序。
在每个volatile写操作的后面插入一个StoreLoad屏障,防止写volatile与后面的读操作重排序。
在每个volatile读操作的后面插入一个LoadLoad屏障,防止读volatile与后面的读操作重排序。
在每个volatile读操作的后面插入一个LoadStore屏障,防止读volatile与后面的写操作重排序。