volatile关键字

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的信息
  • 在并发时可以保证读取的最新的,但是不能保证对变量的操作是互斥以及顺序执行的
上一篇:不学无数——反射和内省的区别


下一篇:不学无数——Java动态代理