-
实现共享变量的可见性,需保证两点
查看全部 -
Java内存模型 / JMM:
共享变量可见性实现的原理:
查看全部 -
Java内存模型的两天规定:
查看全部 -
Java内存模型图
查看全部 -
Java内存模型(JMM):
主内存与工作内存
查看全部 -
Java内存模型(JMM)
查看全部 -
线程执行互斥代码的过程:
获得互斥锁
清空工作内存
从主内存拷贝变量的最新副本到工作内存
执行代码
将更改后的共享变量的值刷新到主内存
释放互斥锁
查看全部 -
二、synchronized实现可见性原理
1、synchronized能够实现:原子性(同步)、可见性
2、JMM关于synchronized的两条规定
a)线程解锁前,必须把共享变量的最新值刷新到主内存中
b)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取新的值
查看全部 -
可见性分析
查看全部 -
2、synchronized和volatile比较
a)volatile不需要加锁,比synchronized更轻便,不会阻塞线程
b)从内存可见性的角度来讲,volatile的读相当于加锁,volatile的写相当于解锁
c)synchronized既能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性
查看全部 -
六、volatile总结
1、volatile适用场合
要在多线程中安全的使用volatile变量,必须同时满足:
a)对变量的写入操作不依赖其当前值
不满足:number++、count=count*5等
满足:boolean变量、记录温度变化的变量等
b)该变量没有包含在其他变量的不变式中
不满足:不变式low<up
查看全部 -
volatile 不加锁即可实现可见性,比synchronized轻量级 效率高;
volatile无法保证原子性所以使用时要注意;synchronized可以保证原子性
查看全部 -
二、synchronized实现可见性原理
1、synchronized能够实现:原子性(同步)、可见性
2、JMM关于synchronized的两条规定
a)线程解锁前,必须把共享变量的最新值刷新到主内存中
b)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取新的值
线程解锁前对共享变量的修改在下次加锁时对其它线程可见
3、线程执行互斥代码的过程
a)获得互斥锁
b)清空工作内存
c)从主内存拷贝变量的最新副本到工作内存
d)执行锁内代码
e)将更改后的共享变量值刷新到主内存
f)释放互斥锁
4、指令重排序
重排序:代码的书写顺序与实际执行的顺序不同,指令重排序是编译器或处理器为了提高程序性能而做的优化
a)编译器优化的重排序(编译器优化)
b)指令级并行重排序(处理器优化)
c)内存系统的重排序(处理器优化)
查看全部 -
多线程:snychronized与volatile比较
查看全部 -
多线程:volatile使用场景
查看全部
举报