美文网首页
聊一聊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

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