多线程、锁、CAS和AQS(2)

多线程、锁、CAS和AQS(2)线程安全之可见性

1、共享变量在线程间不可见的原因

可结合Java内存模型一起阅读



2、可见性 synchronize


使用synchronize修饰后可以保证共享变量的可见性


3、可见性 volatile

可以通过内存屏障和禁止重排序实现。

  • 对volatile变量进行写操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量刷新到主内存。
  • 对volatile变量进行读操作时,会在读操作前加入一条load屏障指令,从主内存读取共享变量。




4、有序性

Java内存模型允许编译器和处理器对指令重排序,重排序虽然不会影响单线程的执行正确性,但是会影响到多线程并发执行的正确性。

vovolatile、synchronize和lock可以保证有序性。

happens before规则,Java内存模型有详细叙述。

5、安全的发布对象

典型的例子就是单例模式的实现,核心就是保证线程安全的三个原则。




全部评论

相关推荐

这不纯纯作弊了吗😢😢😢
编程界菜鸡:信这个的这辈子有了,这智商你靠啥都没用
你找工作的时候用AI吗?
点赞 评论 收藏
分享
测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
05-23 19:02
吉林大学 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 11:30
仁者伍敌:kpi都懒得刷了属于是
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务