-
可见性:一个线程对共享变量值的修改,能能够及时的被其他线程读取
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
查看全部 -
num++不是原子操作,原子操作意为(所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch --百科),volatile能保证可见性,但是在多线程调度时 num++ 被拆分为
1)从主存中读取num值;
2) i = num + 1;
3) 写回i 到主存的num
三步
查看全部 -
volatile(我了头)可以保证volatile变量的可见性,但是不能保证volatile复合操作的原子性
查看全部 -
可见性分析及synchronized解决方案
为啥synchronized原子性可以避免线程交叉执行:因为synchronized加锁在对象上,执行read方法的线程1获得了对象锁,那线程2不能获得对象锁也就不能执行write方法,因为要执行write方法需要获得锁。但是线程1可以继续执行write方法,因为write方法和read方法可以使用同一把锁,synchronized锁可以重入
查看全部 -
二、synchronized实现可见性原理
1、synchronized能够实现:原子性(同步)、可见性
2、JAVA语言层面支持可见性的实现方式
synchronized(申购难死他)
volatile(我了他)
2、JMM关于synchronized的两条规定
a)线程解锁前,必须把共享变量的最新值刷新到主内存中
b)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取新的值
查看全部 -
二条规定的
查看全部 -
volatile适用场合
要在多线程中安全的使用volatile变量,必须同时满足:
a)对变量的写入操作不依赖其当前值
不满足:number++、count=count*5等
满足:boolean变量、记录温度变化的变量等
b)该变量没有包含在具有其他变量的不变式中
不满足:不变式low<up
查看全部 -
两者的比较
查看全部 -
volatile适用场景
查看全部 -
解决number++不是原子性的方案
查看全部 -
共享变量不可见原因
查看全部 -
as-if-serial
查看全部 -
执行互斥锁
查看全部 -
synchronize实现可见性
查看全部 -
线程执行互斥代码的过程:
获得互斥锁
清空工作内存
从主内存拷贝变量的最新副本到工作内存
执行代码
将更改后的共享变量的值刷新到主内存
释放互斥锁
查看全部
举报