upjmbai5800
upjmbai5800
多线程
多线程、锁、CAS和AQS(2)
全部文章
多线程
J.U.C(2)
Java基础(25)
Java源码阅读(3)
JVM(4)
mybatis(3)
react(1)
Redis(1)
Spring(1)
springMVC(1)
专利(3)
刷题随笔(1)
实习随笔(3)
操作系统(3)
数据库(7)
数据结构与算法(6)
网络(1)
面试问题总结(3)
高并发(2)
归档
标签
去牛客网
登录
/
注册
多线程、锁、CAS和AQS(2)
652 浏览
0 回复
2019-08-13
upjmbai5800
+关注
多线程、锁、CAS和AQS(2)线程安全之可见性
1、共享变量在线程间不可见的原因
可结合Java内存模型一起阅读
2、可见性 synchronize
使用synchronize修饰后可以保证共享变量的可见性
3、可见性 volatile
可以通过内存屏障和禁止重排序实现。
对volatile变量进行写操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量刷新到主内存。
对volatile变量进行读操作时,会在读操作前加入一条load屏障指令,从主内存读取共享变量。
4、有序性
Java内存模型允许编译器和处理器对指令重排序,重排序虽然不会影响单线程的执行正确性,但是会影响到多线程并发执行的正确性。
vovolatile、synchronize和lock可以保证有序性。
happens before规则,Java内存模型有详细叙述。
5、安全的发布对象
典型的例子就是单例模式的实现,核心就是保证线程安全的三个原则。
Java基础
多线程
举报
收藏
赞
评论加载中...