原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断;就是不能被线程调度器中断,切换线程。

这样,才能保证,原子操作在线程切换,并行处理上保证数据地顺序累加处理。

可见性:是Jvm较为突出的概念,其每一个线程有自己的工作内存空间,当某一个线程读取了主内存的数据,那么会通知其他线程中自己的内存空间此数据被加屏障,不可读;只能再次从主内存读数据缓存到自己的内存空间。这个概念在Java volitile 关键字体现的,其他系统的这种线程交互机制也应该类似。

指令重排序:

处理器在核心计算区有算术计算芯,逻辑(与或逻辑)计算和位处理。比如:

if(i > 6)
{a = b + c;
}

含有计算且被逻辑条件包含的代码指令,一般在处理器上,先是在算术计算中心计算数据后放入高速缓存中;然后当逻辑条件成立后,才会写回到内存中。原因就是cpu有不一样的计算区,这也是提高CPU计算能力的方式。基于此原理,那么有了指令的重排序。对于并发系统,那么可能出现逻辑混乱现象,但是对于单线程,不存在这个问题。指令重排序是内核做的,所以jvm会和系统内核交互不让其指令重排序。

对于多处理器的并发系统,那么即使遵循上面的三个原则,也是不是出现并发逻辑问题呢?

由于多个处理器,那么可以并发地读主内存数据,然后处理写回数据,这样就会出现逻辑混乱问题。那么在多cpu系统,对于多线程处理同一个方法的任务的时候,调度器只允许一个cpu处理执行其中的一个线程。其他的线程都在等待区,等待前一个线程执行完,才会被调度,交给当前或者其他处理器处理。也就是保证了同一块指令多线程处理的单CPU的顺序执行。

说说Java中原子性,可见性与指令重排序的理解相关推荐

  1. Java之volatile如何保证可见性和指令重排序

    1 我们先了解CPU缓存 CPU缓存为了解决CPU运算速度与内存读写速度不匹配的问题,因为CPU运算速度要比内存读写速度快得多 一次主内存的访问通常在几十到几百个时钟周期 一次L1高速缓存的读写只需要 ...

  2. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  3. JVM并发机制探讨—内存模型、内存可见性和指令重排序

    并发本来就是个有意思的问题,尤其是现在又流行这么一句话:"高帅富加机器,穷矮搓搞优化".从这句话可以看到,无论是高帅富还是穷矮搓都需要深入理解并发编程,高帅富加多了机器,需要协调多 ...

  4. Java指令屏障_指令重排序和内存屏障

    sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...

  5. 由Java引起的指令重排序思考

    背景 问题出现 最近遇到了一个NullPointerException,虽然量不大,但是很怪异,大致长这个样子 这是个什么空指针?居然说我LinkedList.iterator().hasNext() ...

  6. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

    文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...

  7. Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)

    一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专 ...

  8. java volidate线程安全_03.(多线程与并发)面试题-02--Volidate的原理和指令重排序

    线程栈(线程的工作内存)保存了线程运行时候变量值信息.当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本 ...

  9. java重排序_Java synchronized 能防止指令重排序吗?

    @ZealTalk 说的是 synchronized 可以防止指令重排,这个观点不对的,也欢迎回答的各位来讨论 synchronized 的有序性 来讨论这个问题先,先看看 Java 里的操作无序现象 ...

最新文章

  1. 解决原子性问题?你首先需要的是宏观理解
  2. python必背内容-学 Python 必背的42个常见单词,看看你记住了几个?
  3. 生活点滴:java基础知识细化
  4. Sql Server 2005 分页
  5. 推荐系统(3)-协同过滤2-矩阵分解算法
  6. 动态规划入门之国王的金矿
  7. WinForm DataGridView新增加行
  8. 【待完善】【表达学习】稀疏表达SRC方法研究
  9. 阿里巴巴1582.73亿背后的持续交付如何玩
  10. mysql canal 安装测试_canal安装配置与mysql操作监听,我已经帮你踩过了所有的坑...
  11. mysql用正则表达式定位符_MYSQL使用正则表达式过滤数据
  12. ArcMap中无法添加ArcGIS Online底图的诊断方法
  13. 南信大学生怎样看知网,看外文文献
  14. 《企业大数据系统构建实战:技术、架构、实施与应用》——2.3 大数据制度和流程规范...
  15. 轻量级封装DbUtilsMybatis之四MyBatis主键
  16. 千牛插件开发,千牛SDK开发。
  17. magento EAV 模型理解
  18. 计算机毕业设计(63)php小程序毕设作品之校园新生报到小程序系统
  19. 删除 python print()输出的字符里的空格
  20. 超级可爱的萌妹焊接艺术壁画,它是画上去的!

热门文章

  1. trust cv的含义
  2. maven构建scala工程并最终运行的所有细节(scala maven helloworld)
  3. 深拷贝、浅拷贝以及引用传递和按值传递的区别与联系
  4. arcball原理 旋转视图 关键点总结 及代码
  5. 深度学习(二十六)——VAE
  6. 【机器学习】最大熵模型(Maximum Entropy Model)
  7. vim normal 模式下L键
  8. CPU亲缘性及网卡中断绑定
  9. Python解惑:整数比较
  10. Common Trace Format