并发的线程能不能看到变量的最新值,这就是并发中的变量可见性问题
方式一 synchronized
1.进入同步块,先清空工作内存中的共享变量,从
主内存中重新加载
2.解锁前必须把修改的共享变量同步回主内存
方式二 volatile
volatile可用于限制局部代码指令重排序
1.使用volatile变量时,必须重新从主内存加载,并且read,load是连续的
2.修改volatile变量后,必须立马同步回主内存,并且store write是连续的
使用场景:
1.只可修饰成员变量
2.多线程并发下,才需要使用它
volatile典型的应用场景
1.只有一个修改者,多个使用者,要求保证可见性的场景
1.状态
方式三 final
静态属性放在方法区 堆
线程是在栈中
共享变量必须存放在主内存中
线程有自己的工作内存
JAVA内存模型 同步交换协议 规定了8种原子操作
1.lock
2.unlock
3.read
4.load 载入
5.use 使用
6.assign 赋值
7.store 存储
8.write 写入