美文网首页
Java-volatile的作用

Java-volatile的作用

作者: 秦汉邮侠 | 来源:发表于2018-03-15 19:53 被阅读22次

参考来源

使用volatie的场景

如何保证内存的可见性

在java虚拟机的内存模型中,有主内存和工作内存的概念,每个线程对应一个工作内存,并共享主内存的数据,下面看看操作普通变量和volatile变量有什么不同:

1、对于普通变量:读操作会优先读取工作内存的数据,如果工作内存中不存在,则从主内存中拷贝一份数据到工作内存中;写操作只会修改工作内存的副本数据,这种情况下,其它线程就无法读取变量的最新值。

2、对于volatile变量,读操作时JMM会把工作内存中对应的值设为无效,要求线程从主内存中读取数据;写操作时JMM会把工作内存中对应的数据刷新到主内存中,这种情况下,其它线程就可以读取变量的最新值。

volatile变量的内存可见性是基于内存屏障(Memory Barrier)实现的,什么是内存屏障?内存屏障,又称内存栅栏,是一个CPU指令。在程序运行时,为了提高执行性能,编译器和处理器会对指令进行重排序,JMM为了保证在不同的编译器和CPU上有相同的结果,通过插入特定类型的内存屏障来禁止特定类型的编译器重排序和处理器重排序,插入一条内存屏障会告诉编译器和CPU:不管什么指令都不能和这条Memory Barrier指令重排序。

什么指令重排

这个lock前缀指令相当于上述的内存屏障,提供了以下保证:
1、将当前CPU缓存行的数据写回到主内存;
2、这个写回内存的操作会导致在其它CPU里缓存了该内存地址的数据无效。

相关文章

  • Java-volatile的作用

    参考来源 java volatile关键字解惑 使用volatie的场景 如何保证内存的可见性 在java虚拟机的...

  • Java-volatile

    JMM(Java内存模型) 首先我们看下执行a+b这个操作需要几步:1.从内存中取出a2.从内存中取出b3.执行a...

  • java-volatile解析

    volatile关键字,熟悉的朋友应该能总结到该关键字的特征如下: 1.保证可见性、但不保证原子性 2.禁止指令重...

  • “领导作用”的作用

    【见】今天组织召开月度例会,由各部门领导汇报当月开展的工作内容以及下月的工作计划。听着每个人的汇报,声音入耳,大脑...

  • &的作用

  • 「分享」 的作用和副作用

    (一) ——你知道为什么这么多人喜欢看你写的东西吗?——为什么?——其实啊,我们中国人这么多年没怎么变。以前大家住...

  • 作用域&js分号的作用

    以上代码输出为: 原因:作用域:执行上下文中包含作用域链在理解作用域链之前,先介绍一下作用域,作用域可以理解为执行...

  • 一网打尽 JavaScript 的作用域

    JavaScript 的作用域包括:模块作用域,函数作用域,块作用域,词法作用域和全局作用域。 全局作用域 在任何...

  • 作用与反作用

    “别在伤口上撒盐”这句话听着有些难过,但是,在伤口上撒盐未必也不是好事,相反,有消杀细菌的作用,凡事无绝对。

  • 作用与反作用

    今日,我心情很好。赞叹自己能够在这段时间尽早地发现自己的一些问题。 我最近一直在观察自己,为什么碰到大事就容易退缩...

网友评论

      本文标题:Java-volatile的作用

      本文链接:https://www.haomeiwen.com/subject/yebnaxtx.html