文章目录
- 介绍
- 使用场景
- volatile 变量规则
- 双重锁定的单例模式
介绍
- volatile 关键字时 Java 虚拟机提供的最轻量级的同步机制
- 当一个变量被定义称 volatile 之后, 它将具备两项特性
- 1.保证此变量对所有线程的可见性: 当一条线程修改了这个变量的值, 新值对于其他线程来说是可以立即得知的
- 并发自增运算 i++ 中, 当指令把 i 的值取到操作栈顶时, volatile 关键字保证了 i 的值在此时是正确的。
- 但是此时其他线程可能已经把 i 的值改变了, 而操作栈顶的值就变成了过期数据
- 2.禁止指令重排序优化
- 指令重排序是指处理器采用了允许多条指令不按照程序规定的顺序进行处理, 但是会保证得到正确的执行结果
- 1.保证此变量对所有线程的可见性: 当一条线程修改了这个变量的值, 新值对于其他线程来说是可以立即得知的
使用场景
- 运算结果不依赖于当前的变量值, 或者只有一个线程修改变量的值
- 变量不需要于其他状态变量共同参与不变约束
volatile 变量规则
- 对于一个 volatile 变量的写操作先行发生于后面对这个变量的读操作 (“后面” 指时间上的先后)
- 在工作内存中, 每次使用 volatile 变量前都必须先从主内存刷新最新的值, 用于保证能看见其他线程对 volatile 变量所做的修改
- 在工作内存中, 每次修改 volatile 变量后都必须立刻同步回主内存中, 用于保证其他线程可以看到对 volatile 变量所做的修改
- volatile 修饰的变量不会被指令重排序优化, 从而保证代码的执行顺序与程序的顺序相同
- volatile 变量的读操作的性能消耗与普通变量几乎没有差别
- volatile 变量的写操作可能会慢一些, 因为需要插入许多内存屏障来保证处理器不乱序执行