Java基础之Volatile原理
原文链接: http://www.aoaoyi.com/archives/956.html
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据 的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就 存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU 执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来 进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。当程序在运行过程 中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可 以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数 据刷新到主存当中。举个简单的例子,比如下面的这段代码:
i = i + 1;
当线程执行这个语句时,会先从主存当中读取 i 的值,然后复制一份到高速缓存当中, 然后 CPU 执行指令对 i 进行加1操作,然后将数据写入高速缓存,最后将高速缓存 中 i 最新的值刷新到主存当中。
这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有问题了。在多核 CPU 中,每条线程可能运行于不同的 CPU 中,因此 每个线程运行时有自己的高速缓存(对 单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。比如 同时有两个线程执行这段代码,假如初始时 i 的值为 0 ,那么我们希望两个线程执行完之后i 的值变为2。但是事实会是这样吗?
可能出现这种情况:初始时,两个线程分别读取 i 的值存入各自所在的 CPU 的高速缓存当 中,然后 线程1 进行加1操作,然后把 i 的最新值1写入到内存。此时线程2的高速缓存当 中 i 的值还是0,进行加1操作之后, i 的值为1,然后线程2把i的值写入内存。最终结 果 i 的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量 为共享变量。
转自:http://wptp.rongyipiao.com/?p=190
Java基础之Volatile原理的更多相关文章
- java基础系列--volatile关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 1.volatile简述 据说,volatile是java语言中最轻 ...
- Java基础之Synchronized原理
思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type ...
- 【Java基础】HashMap原理详解
哈希表(hash table) 也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中Has ...
- java基础-注解Annotation原理和用法
在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...
- Java基础 | Stream流原理与用法总结
Stream简化元素计算: 一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream: ...
- JAVA基础之——Thrift原理及应用
1 是什么 是为了解决facebook系统中各系统间大数据量的传输通信,以及系统之间语言环境不同需要跨平台的问题. 是一种实现RPC的软件框架,自定义IDL(Interface description ...
- Java基础之HashMap原理分析(put、get、resize)
在分析HashMap之前,先看下图,理解一下HashMap的结构 我手画了一个图,简单描述一下HashMap的结构,数组+链表构成一个HashMap,当我们调用put方法的时候增加一个新的 key-v ...
- Java基础之LinkedHashMap原理分析
知识准备HashMap 我们平时用LinkedHashMap的时候,都会写下面这段 LinkedHashMap<String, Object> map = new LinkedHashMa ...
- 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 ...
随机推荐
- java 集合数组排序
//数组排序Integer arr[] = {3,4,2};Arrays.sort(arr);//默认升序Arrays.sort(arr,Comparator.reverseOrder());//传一 ...
- java 8 foreach获取索引
当 forEach 需要索引 https://segmentfault.com/a/1190000007881498 或者采用 List<string> stringList = new ...
- 我说CMMI之七:需求管理过程域--转载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...
- k8s资源对象及API群组
REST是representational state transfer的缩写,意为“表征状态转移”,它是一种程序架构风格,基本元素为资源(resource).表征(representation)和行 ...
- 提取全局应用程序集中的dll
如何提取全局应用程序集中的dll GAC路径:C:\WINDOWS\assembly 在资源管理器中打开这个路径看到的东西不能复制,右键中也只有 “卸载” 和 “属性” 两个菜单. 在命令提示符下切换 ...
- qt5--定时器
定时器方式一:----定时器事件 需要 #include <QTimerEvent> #include "win.h" #include <QDebug& ...
- 手动解析网易云音乐MP3真实地址
火狐打开音乐播放页面 然后按F12 点击网络选项卡 点击音乐播放按钮 然后过滤输入“url” 选中筛选出来的结果 点击右边的相应选项卡 下面的url里面就是真实的预约MP3地址
- JavaScript基础——JavaScript函数(笔记)
avaScript 函数(笔记) JavaScript 是函数式编程语言,在JavaScript脚本中可以随处看到函数,函数构成了JavaScript源代码的主体. 一.定义函数 定义函数的方法有两种 ...
- Arthas--Java在线分析诊断工具(阿尔萨斯)
序言 Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. 资料 https://blog.csdn.net/youanyyou/article/ ...
- BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp
开始读错题了,然后发现一眼切~ Code: #include <cstdio> #include <algorithm> #define ll long long #defin ...