volatile关键字
@Date 2016.06.20
共享变量
- 多个线程之间能够被共享的变量
- 存放在堆内存中的实例变量,静态变量,数组变量
内存屏障
- CPU指令,用于实现对内存操作的顺序限制
Volatile
- 确保所有线程看到这个变量的值是一致的
- 不会引起线程上下文的切换和调度
- JVM就会向处理器发送一条Lock前缀的指令
- 缓存一致性协议: 当处理器发现自己缓存行对应的内存地址被修改,会将当前处理器的缓存行设置成无效状态
- 将当前处理器缓存行的数据会写回到系统内存
- 写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效
- 大多数处理器高速缓存行是64个字节宽
- 保证了可见性(对于一个变量i,多个线程同时去操作(比如++),i的值一定是0->1->2->3,而如果不加volatile则i的值可能是0->1->1->2)
- 不保证顺序性和原子性(volatile不会锁住变量,你再对第一个变量i做完操作之后,下一个volatile变量j可能已经发生改变了)
补充
- 强制线程去主存中读取Heap的信息
- 在并发时可以保证读取的最新的,但是不能保证对变量的操作是互斥以及顺序执行的