简单相识下JMM办理什么题目

[复制链接]
发表于 2026-2-2 22:49:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
你好,这里是codetrend专栏“高并发编程根本”。
点击合集可以检察往期文章。
什么是JMM

Java内存模子(JMM)是Java语言规范的一部门,界说了多线程环境下共享变量的访问规则。它办理了以下告急题目:

  • 可见性:确保一个线程对共享变量的修改可以或许被其他线程看到。
  • 原子性:包管某些利用的不可分割性。
  • 有序性:制止由于编译器和处理处罚器优化而导致的指令重排序题目。
JMM通过“happens-before”规则和内存屏蔽等机制,确保在多线程步调中,各线程对共享变量的利用举动符合预期。
CPU计划决定JMM计划

复杂的CPU计划必要计划Java内存模子(JMM)的缘故原由包罗:

  • 指令重排序:

    • CPU和编译器大概会对指令举行重排序以优化性能,这大概导致差异线程看到的利用序次不同等。

  • 缓存同等性:

    • 多核CPU的每个焦点大概有本身的缓存,JMM确保差异焦点之间的缓存同等性,使得一个线程的修改能被其他线程看到。

  • 内存屏蔽:

    • 为了确保线程利用的精确序次,必要在指令之间插入内存屏蔽。JMM界说了这些屏蔽的举动,确保内存利用的可见性和序次性。

  • 优化与并发:

    • 当代CPU举行各种优化(如乱序实行),JMM提供了规则以包管这些优化不会粉碎多线程步调的精确性。

CPU计划和JMM的接洽

CPU计划和Java内存模子(JMM)在多线程步调中的脚色固然干系,但它们关注的层面和目的有所差异。
接洽


  • 多线程同步:

    • JMM:界说了在Java步调中线程之间共享变量的可见性、原子性和有序性,确保多线程步调的精确性。
    • CPU计划:提供硬件支持,以确保差异线程间的利用同等性,大概通过缓存同等性协议、内存屏蔽等方式来实现。

  • 内存同等性:

    • JMM:通过“happens-before”规则确保线程利用的可见性和序次性。
    • CPU计划:实现缓存同等性协议(如MESI协议)来包管差异焦点或线程对内存的视图同等。

  • 指令重排序:

    • JMM:规定了编译器和处理处罚器在实行线程利用时的举动,制止由于重排序导致的错误结果。
    • CPU计划:答应指令重排序以进步性能,并通过内存屏蔽和同步机制确保重排序不会粉碎步调的精确性。

区别


  • 关注层面:

    • JMM:关注于Java步调中的线程间内存利用的语义,是一种抽象的内存模子,形貌了Java捏造机和步调员之间的举动规范。
    • CPU计划:关注于硬件级别的实现细节,如处理处罚器架构、缓存管理、管道化等,是详细的硬件计划和优化。

  • 实现方式:

    • JMM:通过Java语言规范和Java捏造机的实现来包管线程的精确性,不直接涉及硬件实现细节。
    • CPU计划:涉及详细的硬件计划和微架构实现,如缓存同等性协议、内存屏蔽等,以支持多线程利用的精确性和高效性。

  • 抽象条理:

    • JMM:在软件层面上界说举动,告急面向步调员和Java捏造机的实现者,抽象了硬件的细节。
    • CPU计划:在硬件层面上界说利用,涉及详细的电路和硬件实现,直接影响性能和功能。

JMM带来的长处

JMM的计划作为一个同一入口,镌汰了开辟工作量,包罗兼容、性能这些都处理处罚。

  • 进步步调的可移植性:由于 JMM 提供了一个同一的内存模子,Java 步调可以在差异的硬件平台和利用体系上无需修改或只需少量修改就可以或许精确运行。这大大进步了 Java 步调的可移植性,使得开辟职员可以更加专注于业务逻辑的实现,而不必担心底层硬件的差异。
  • 包管多线程编程的精确性:JMM 界说了一系列规则来包管多线程环境下内存的可见性、原子性和有序性。这使得开辟职员可以使用 Java 提供的同步机制(如 synchronized、volatile 等)来确保多线程步调的精确性,制止了由于硬件特性和编译器优化导致的难以调试的错误。
  • 便于开辟职员明白和使用:JMM 提供了一个相对简单和直观的内存模子,开辟职员可以更容易地明白多线程编程中的内存访问举动和同步机制。这有助于进步开辟服从,镌汰错误的发生。
  • 优化性能:固然 JMM 对内存访问举行了肯定的限定,但同时也提供了一些优化的时机。比方,公道地使用 volatile 关键字和原子类可以制止不须要的锁竞争,进步步调的性能。别的,JMM 也答应编译器和处理处罚器在不影响步调精确性的条件下举行一些优化,如指令重排序等,以进步步调的实行服从。
JMM的发展历程


  • Java 1.0 和 1.1:

    • 初期版本没有明白的内存模子,线程安全和同步的界说较为疏松。

  • Java 1.2:

    • 引入了 synchronized 关键字和 volatile 变量,开端界说了多线程的根本同步机制。

  • Java 1.5 (2004):

    • 引入了 Java 内存模子(JMM)的正式规范。增长了 java.util.concurrent 包,提供了更丰富的并发工具和原子变量。
    • 创建了 JMM 的根本规则,如 happens-before 关系、可见性、原子性和有序性。

  • Java 1.6 到 1.8:

    • 在 JMM 的根本上,增长了更多并发工具和优化机制,如 ConcurrentHashMap 和 ForkJoinPool。
    • 对 JMM 举行了性能优化和增补,如增强了对编译器和处理处罚器优化的支持。

  • Java 9 到 11:

    • 引入了新的特性如 CompletableFuture 和增强的 Stream API,进一步进步了并发编程的服从和浅显性。

  • Java 12 及以后:

    • 连续优化和增补并发编程干系的特性和工具,如 Record 范例和 Pattern Matching,并不绝调解 JMM 以顺应新的编程模式。

JMM不绝在不绝发展以顺应差异的计划和硬件。

  • 进一步增强性能:

    • 通过硬件支持和编译器优化,继承进步 JMM 在多线程环境下的性能表现。

  • 顺应新编程模子:

    • 支持新兴的编程模子和并发模式,比方相应式编程和协程(轻量级线程)。

  • 简化开辟和调试:

    • 提供更高条理的抽象和工具,以简化并发编程的开辟和调试过程。

  • 跨平台同等性:

    • 确保 JMM 在差异硬件平台和 JVM 实现中的同等性,以进步跨平台的兼容性和可靠性。

  • 增强文档和教导:

    • 提供更全面的文档和教导资源,资助开辟者更好地明白和应用 JMM。

关于作者

来自一线全栈步调员nine的探索与实践,连续迭代中。
接待关注、品评、点赞。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表