volatile

volatile就是轻量级的synchronized

它让多处理器开发中保证了共享变量的可见性,可见性的意思是当一个线程修改一个变量时,其他变量能读到这个修改的值,如果一个字段被声明为volatile,JMM保证所有线程看到这个变量的值是一致的

  • 对任意单个volatile变量的读写具有原子性,但类似于volatile++这种复合操作不具有原子性
  • volatile可以保证可见性,当一个变量被volatile修饰后,线程对此变量的读取不能从本地内存中读取,必须要从主内存中读取,然后缓存到本地内存中
  • volatile可以保证有序性,禁止指令重排序

volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性,在JVM底层,volatile使用内存屏障实现

指令重排序

执行程序时,为了提高性能,编译器和处理器经常会对指令做重排序

  • 编译器重排序:编译器在不改单线程程序语义的前提下,可以重新安排语句的执行顺序
  • 处理器重排序:如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序

happens-before

happens-before保证了程序的有序性,它规定如果两个操作的执行顺序无法从happens-before原则中推导出来,那么他们就不能保证有序性,可以随意进行重排序

JVM如何禁止重排序?

观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码,发现加入volatile关键字时,会多出一个lock前缀指令

lock前缀指令其实就相当于一个内存屏障

内存屏障是一组处理指令,用于实现对内存操作的顺序限制,volatile底层就是通过内存屏障实现的


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

synchronized Previous
ThreadLocal Next