美文网首页
聊一聊volatile

聊一聊volatile

作者: ZhangQK | 来源:发表于2019-03-30 19:51 被阅读0次

  volatile,作为并发编程常见的关键字,经常被开发者在日常开发中使用,但是你真的了解volatile吗?volatile等同于锁吗?

  首先我们先来看一下volatile的含义:当某个共享变量被volatile修饰后,即代表了当某个线程修改了该共享变量的值,则对其他线程来说,修改后的值是立即可见的。也就是说,使用volatile修饰后,共享变量修改的值,会立即强制刷新到内存中。同时,会通知其他线程,该共享变量之前缓存在各个线程中的旧值失效,需要去内存中读取新修改的值。

  但是volatile只会保证可见性,并不能保证原子性。

   1.对于一个volatile变量的读,总是能看到(任意线程)对于这个volatile变量最后的写入。
   2.对任意单个volatile变量的读或者写操作具有原子性,但类似于volatile++这种复合操作不具有原子性。

  我们来看一下volatile的内存语义:
  1.当写一个volatile变量时,JMM(Java Memory Model)会把该线程对应的本地内存中的共享变量值刷新到主内存中。
  2.当读一个volatile变量时,JMM会把该线程对应的本地内存值置为无效,线程接下来会从主内存中读取共享变量。

  同时,为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止指令重新排序。

  具体的实现原理,再对比了有volatile和无volatile的汇编代码后,发现有volatile的话,会多出一个lock前缀,该前缀的作用,即保证了volatile的特性。
  由于volatile只能保证对单个volatile变量的读写具有原子性,而锁可以保证整个临界区代码都具有原子性,功能性上来说,锁要比volatile更加强大。

相关文章

  • 聊一聊volatile

      volatile,作为并发编程常见的关键字,经常被开发者在日常开发中使用,但是你真的了解volatile吗?v...

  • 浅聊 volatile原理

    volatile volatile 只能保证对单次读/写的原子性。i++ 这种符合操作操作不能保证原子性。 禁止指...

  • volatile vs synchronized

    今天来聊一聊Java并发编程中两个常用的关键字:volatile和synchronized。 在介绍这两个关键字之...

  • 聊一聊

    就是这样,喜欢自我欺骗,明知道,真心想你,或者有事的人,会打电话给你。却还是忍不住的用微信,看一个人的消息和动态,...

  • 聊一聊

    记录一下,现在是女儿的生日。2020.7.25星期六 生日快乐我的小天使 微淼商学院说过最经典的话是:有些做商学院...

  • 聊一聊

    早在三天前师兄就告知我们今天上午老师会和我们在实验室聊一聊。校园卡余额不足,时间紧张未吃早餐,早上慌忙收拾赶紧到实...

  • 聊一聊

    大家好,我是野生梅花鹿。 马上就12点了,我决定用几分钟的时间随便写点啥~ 首先呢,是反省。 这个月,其实懒惰了很...

  • 聊一聊

    很久没写了,聊聊最近发生的事,十月份开始了一段长板之旅,一开始担心害怕摔,因为通过挑战一个个动作,挺有趣的,当你为...

  • 聊一聊

    疫情这些年,常常听到的是,哪哪被封控了之类,作为天选打工人,一直在正常上班搬砖中。 直至上周五晚接...

  • 聊一聊自律

    很久以前就知道韩雪,当时只觉得她是气质很优雅,长得很美丽的女明星,没有什么特殊的感觉,应该就是花瓶而已。 她的才气...

网友评论

      本文标题:聊一聊volatile

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