zoukankan      html  css  js  c++  java
  • java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念。

    CPU内存指令重排序(Memory Reordering)

    什么叫重排序?

    重排序的背景

    我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多。当CPU的计算速度远远超过访问cache时,会产生cache wait,过多的cache wait就会造成性能瓶颈。
    针对这种情况,多数架构(包括X86)采用了一种将cache分片的解决方案,即将一块cache划分成互不关联地多个 slots (逻辑存储单元,又名 Memory Bank 或 Cache Bank),CPU可以自行选择在多个 idle bank 中进行存取。这种 SMP 的设计,显著提高了CPU的并行处理能力,也回避了cache访问瓶颈。

    简单来说,现在CPU为了追求高性能,做了一些优化,这个优化就是重排序。

    通过对指令重排,CPU可以获得更快地响应速度,但也给编写并发程序的程序员带来了诸多挑战。

    重排序会引起多线程的可见性问题。

    比如线程A和线程B看到的共享区数据会不一致。

    那如何来解决这个问题呢?

    答案是:内存屏障。

    什么是内存屏障?

    简单来说,就是一条指令,这条指令指示不要对这些代码或代码块进行重排序。

    java世界中用关键字:volatile,来指定这个变量使用内存屏障,来保证穿上变量不会被重排序,从来达到解决数据的可见性问题。

    事实上,java一般用volatile和CAS锁来实现线程间的数据同步,达到高性能,高并发。

     那么,用了volatile和CAS锁,是否就高枕无忧了呢?

    否!

    这里还有一个坑,那就是:伪共享问题。

    请听下节分解。

    本人精通java高并发,DDD,微服务等技术实践,专注java,rust技术栈。 本人姓名郭莹城,坐标深圳,前IBM架构师、咨询师、敏捷开发技术教练,前IBM区块链研究小组成员、十多年架构设计工作经验,《区块链核心技术与应用》作者之一, 现聚焦于:区块链创投与交易所资源对接和技术咨询。 工作微信&QQ:360369487,区块链创投与交易所资源对接,加我注明:博客园+对接,技术咨询和顾问,加我注明:博客园+顾问。想学习golang和rust的同学,也可以加我微信,备注:博客园+golang或博客园+rust,谢谢!
  • 相关阅读:
    磁盘 inodes 不足 Free inodes is less than 20% on volume
    记录一次Nginx使用第三方模块fair导致的线上故障排错
    xml 特殊字符 导致的 solr 数据导入异常
    Jenkins 定时备份插件 ThinBackup
    Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本
    Elasticsearch定时删除索引第二版
    js for in 获得遍历数组索引和对象属性
    js函数作用域
    django 1.11.1 连接MySQL
    angular 4 和django 1.11.1 前后端交互 总结
  • 原文地址:https://www.cnblogs.com/gyc567/p/11020722.html
Copyright © 2011-2022 走看看