1、请你谈谈对Volatile的理解?
Volatile是java虚拟机提供轻量级的同步机制
1)保证可见性
2)不保证原子性
3)禁止指令重排
2、什么是JMM
JMM:java内存模型,不存在的东西,概念!约定
关于JMM的一些同步的约定:
1)线程解锁前,必须将共享变量立刻刷回主存
2)线程加锁前,必须读取主存中的最新值到工作内存中
3)加锁和解锁是同一把锁
线程 工作内存、主内存
8种操作
上面的write和store需要换个位置
存在的问题
问题:程序不知道主内存的值已经被修改过了
引入Volatile
1、保证可见性
2、不保证原子性
原子性:不可分割
线程A执行任务的时候,不能被打扰,也不能被分割。要么同时失败,要么同时成功!
如果不加lock和synchronized 如何保证原子性?
使用原子类解决原子性问题
这些类的底层都直接和操作系统挂钩 在内存中修改值 Unsafe类是一个特殊的存在
3、指令重排
源代码 -- > 编译器优化的重排 -- > 指令并行也可能会重排 -- > 内存系统也会重排 --> 执行
处理器在执行指令重拍的时候 需要考虑:数据之间的依赖性
Valotile可以避免指令重排:
内存屏障 (单例模式使用的最多) cpu指令 作用
1)保证特定的操作的执行顺序
2)可以保证某些变量的看可见性(利用这些特性volatile实现了可见性)