说说Java中原子性,可见性与指令重排序的理解
原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断;就是不能被线程调度器中断,切换线程。
这样,才能保证,原子操作在线程切换,并行处理上保证数据地顺序累加处理。
可见性:是Jvm较为突出的概念,其每一个线程有自己的工作内存空间,当某一个线程读取了主内存的数据,那么会通知其他线程中自己的内存空间此数据被加屏障,不可读;只能再次从主内存读数据缓存到自己的内存空间。这个概念在Java volitile 关键字体现的,其他系统的这种线程交互机制也应该类似。
指令重排序:
处理器在核心计算区有算术计算芯,逻辑(与或逻辑)计算和位处理。比如:
if(i > 6)
{a = b + c;
}
含有计算且被逻辑条件包含的代码指令,一般在处理器上,先是在算术计算中心计算数据后放入高速缓存中;然后当逻辑条件成立后,才会写回到内存中。原因就是cpu有不一样的计算区,这也是提高CPU计算能力的方式。基于此原理,那么有了指令的重排序。对于并发系统,那么可能出现逻辑混乱现象,但是对于单线程,不存在这个问题。指令重排序是内核做的,所以jvm会和系统内核交互不让其指令重排序。
对于多处理器的并发系统,那么即使遵循上面的三个原则,也是不是出现并发逻辑问题呢?
由于多个处理器,那么可以并发地读主内存数据,然后处理写回数据,这样就会出现逻辑混乱问题。那么在多cpu系统,对于多线程处理同一个方法的任务的时候,调度器只允许一个cpu处理执行其中的一个线程。其他的线程都在等待区,等待前一个线程执行完,才会被调度,交给当前或者其他处理器处理。也就是保证了同一块指令多线程处理的单CPU的顺序执行。
说说Java中原子性,可见性与指令重排序的理解相关推荐
- Java之volatile如何保证可见性和指令重排序
1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...
- JVM学习--(二)内存模型、可见性、指令重排序
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...
- JVM并发机制探讨—内存模型、内存可见性和指令重排序
并发本来就是个有意思的问题,尤其是现在又流行这么一句话:"高帅富加机器,穷矮搓搞优化".从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多 ...
- Java指令屏障_指令重排序和内存屏障
sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...
- 由Java引起的指令重排序思考
背景 问题出现 最近遇到了一个NullPointerException,虽然量不大,但是很怪异,大致长这个样子 这是个什么空指针?居然说我LinkedList.iterator().hasNext() ...
- 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...
- java volidate线程安全_03.(多线程与并发)面试题-02--Volidate的原理和指令重排序
线程栈(线程的工作内存)保存了线程运行时候变量值信息.当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本 ...
- java重排序_Java synchronized 能防止指令重排序吗?
@ZealTalk 说的是 synchronized 可以防止指令重排,这个观点不对的,也欢迎回答的各位来讨论 synchronized 的有序性 来讨论这个问题先,先看看 Java 里的操作无序现象 ...
最新文章
- 解决原子性问题?你首先需要的是宏观理解
- python必背内容-学 Python 必背的42个常见单词,看看你记住了几个?
- 生活点滴:java基础知识细化
- Sql Server 2005 分页
- 推荐系统(3)-协同过滤2-矩阵分解算法
- 动态规划入门之国王的金矿
- WinForm DataGridView新增加行
- 【待完善】【表达学习】稀疏表达SRC方法研究
- 阿里巴巴1582.73亿背后的持续交付如何玩
- mysql canal 安装测试_canal安装配置与mysql操作监听,我已经帮你踩过了所有的坑...
- mysql用正则表达式定位符_MYSQL使用正则表达式过滤数据
- ArcMap中无法添加ArcGIS Online底图的诊断方法
- 南信大学生怎样看知网,看外文文献
- 《企业大数据系统构建实战:技术、架构、实施与应用》——2.3 大数据制度和流程规范...
- 轻量级封装DbUtilsMybatis之四MyBatis主键
- 千牛插件开发,千牛SDK开发。
- magento EAV 模型理解
- 计算机毕业设计(63)php小程序毕设作品之校园新生报到小程序系统
- 删除 python print()输出的字符里的空格
- 超级可爱的萌妹焊接艺术壁画,它是画上去的!