文档章节

【转】Volatile 实现原理

小灰灰Blog
 小灰灰Blog
发布于 2017/04/25 14:57
字数 599
阅读 10
收藏 0

volatile

java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。

这个变量用够很久,一直都没有深入研究过,虽然说知道主要是用于线程内变量共享,但却不知所以然,正好看到一个博文,感觉写的很nice,就摘抄了其中一些,补了一个个人理解的图

原文链接: 聊聊并发(一)深入分析Volatile的实现原理

实现原理

处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里 用一个图简单的说明上面的过程

图画的一般般,简单说一下

  1. cpu与内部缓存进行交互
  2. volatile生命的变量,操作完之后写入内存(data -> data' 同时写入内存)
  3. 其他cpu缓存嗅探总线变动,并设置自己的data无效,使用时,从内存中获取

输入图片说明

本文转载自:http://ifeve.com/volatile/

小灰灰Blog
粉丝 195
博文 204
码字总数 363562
作品 0
武汉
程序员
私信 提问
Volatile的作用

众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用。那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就是磁盘(硬盘),但是访问的速度也是...

青夜之衫
2017/12/05
0
0
Java Web技术经验总结(六)

synchronized的作用和原理:link 使用经验:synchronized是一种互斥锁。在Java开发中,当某个变量需要在多个线程之间共享时,需要分析具体的场景:如果多个线程对该共享变量的读和写之间没有...

杜琪
2016/06/16
0
0
java并发编程:关键字

一、关键字volatile(易变的): 1、保证了多线程操作的可见性; 2、但是无法保证对变量的任何操作都是原子性的(如自增操作); 3、禁止指令重排序,能在一定程度上保证有序性; 禁止指令重...

rathan0
2015/09/16
29
0
Java并发机制底层实现原理-volatile

章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code->Java class->JVM->汇编指令->cpu执行 java中使用的并发机制依赖于JVM实现和cpu指令。 1.1 volatile应用 ...

markfork
2018/04/29
0
0
Java集合及concurrent并发包总结(转)

1.集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对。 Collection中最常用的又分为两种类型的接口:List和Set,两...

磨砂轮
2016/09/22
55
0

没有更多内容

加载失败,请刷新页面

加载更多

面向对象方面的一些东东

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" cont......

流年那么伤
25分钟前
2
0
git 过滤文件夹和文件(IDEA)

最近使用git版本管理工具遇到一件很烦的事情,commit时总会把.idea、.*.iml和target文件添加进来,实际开发中,这些是需要过滤掉的。在.gitnore文件添加了过滤不起作用。下面介绍一种成功过滤...

uug
33分钟前
2
0
Spark Streaming 实时统计商户当日累计PV流量

一、问题 对实时流量日志过滤筛选商户流量,对每个商户的流量进行累计,统计商户实时累计流量。 当时间超过24时时,重新统计当日商户的实时累计流量。 二、实现步骤 1、采用Spark Streaming...

boonya
38分钟前
2
0
如果Task与Event 创建了记录类型后,不出现在Lightning的Activities中

如果在Lightning的Activities没出现这两个Button,但是在页面布局的Lightning 按钮区也存在,全局操作的记录类型就需要选择一个,否则不会出现

在山的那边
47分钟前
2
0
ddd中的子域和界限上下文

我们先来说说子域是什么?子域在我的理解是在一个庞大的系统中可以明显感知的不同的区块,如果在电商模块中,商品目录,订单,物流,库存,发票等等都可以感知他们明显的不同,可以认为是子域...

算法之名
56分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部