volatile 可见性:退不出去的循环

 

volatile 可以保证变量的有序性和可见性

有一个共享变量 private static boolean run = false(共享变量会放到主存中),

当某个线程多次访问该变量次数达到某个阈值时,就会从高速缓存中获取该值,不会在从主存中获取,

可能会导致该值已经被修改了,但是拿到的不是被修改后的值,导致线程不能退出结束

因此需要用 volatile 来修饰这个共享变量,来让获取的值每次都是在主存中获取,就可以避免上述情况

volatile 适合多次获取 只有一处修改的情况下

别的情况 还是用synchronized来保证

 

 

 

 

 

 

 

 

 

 对于有序性,指令加载代码的时候 可能会改变加载代码的顺序,导致结果不是自己想要的

如:

 

 这个结果可能时 0 1 4 ,发生0的时候 时由于 num=2; ready=true 加载顺序变为 ready=true; num=2

所以可以在 boolean ready = false 前边加上 volatile ,

volatile  写屏障 、读屏障

volatile 保证在写入之前的操作指令顺序排列,写屏障

volatile 修饰的变量保证读之后的都是从主内存中读取变量值 读屏障

 

(为什么值在ready上边加呢,因为时保证ready的顺序不变就行)

 

 

 

 

 

posted on 2021-11-03 15:34  lmcc  阅读(81)  评论(0)    收藏  举报

导航