volatile关键字

介绍

在多线程操作共享变量时, 会使用volatile修饰共享变量, 比如单例模式的双重锁检查中, 并且在concurrent包下也大量使用了volatile关键字;
volatile可以对类属性进行修饰, 从而确保线程每次都是从主存中获取属性, 操作完毕后写回主存.

java内存模型

在多线程同时对共享变量进行操作过程中, 每个线程会拷贝一份共享变量到自己的工作内存中进行相关操作, 操作完毕后会将结果写入到主存中.
而volatile关键字可以保证操作的可见性和有序性, 但是却不能保证原子性.

扩展

原子性

指一个操作或者多个操作要么全部执行要么全部都不执行, 操作过程整体是一个原子, 不被分割打断.

可见性

当多个线程访问同一个变量时, 一个线程修改了这个变量的值, 其他线程能够立即看得到修改的值.

有序性

即程序执行的顺序按照代码的先后顺序执行
主要原因是因为处理器在处理程序时会进行指令重排, 对代码进行优化, 指令重排在单线程中得到的结果是一致的, 但是在多线程中就会造成各种错误.

volatile关键字作用

1.使用volatile关键字修饰的变量,会强制将修改的值写入到主存中
2.volatile不保证原子性, 在多线程操作下仅能保证操作别的线程可见, 在多线程情况下同时操作共享变量依然会有数据不正确的情况.
3.volatile会防止指令重排


   转载规则


《volatile关键字》 liuzhihang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录