• 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,谢谢!
  • 相关阅读:
    VS编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version
    C++ STL std::copy 详解
    JavaScript:{}、new Object和Object.create的区别
    函数声明和函数表达式的区别
    Java基础重写override
    Java基础多态数组
    Java基础编译类型和运行类型(多态)
    Java基础继承的内存分析
    Java基础访问修饰符
    Java基础继承的使用
  • 原文地址:https://www.cnblogs.com/gyc567/p/11020722.html
Copyright © 2020-2023  润新知