多线程、锁、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、安全的发布对象

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




全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务