Java内存模型(JMM)详解

Java内存模型(Java Memory Model,JMM) 关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。Java基础部分算法与编程数据库部分流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。 阅读详情

1. 介绍

1.1 JMM概述

        Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。

1.2 主要概念

  • 共享变量:在多个线程之间可见的变量,例如对象的字段、静态变量等。
  • 主内存:是线程间共享的内存区域,所有线程都可以访问。主内存存储了共享变量的原始副本。
  • 工作内存:是线程私有的内存区域,每个线程有自己的工作内存。工作内存中存储了主内存中共享变量的副本。

1.3 JMM 的作用

  • 保证可见性:确保一个线程对共享变量的修改对其他线程是可见的。即当一个线程修改了某个共享变量时,其他线程能够立即看到这个变化。

  • 保证原子性:确保一些特定操作不会被中断,使得它们在多线程环境中的执行结果与在单线程环境中的执行结果一致。例如,一个操作要么完整地执行,要么不执行,不会出现部分执行的情况。

  • 保证有序性:规定程序中的代码执行顺序,禁止编译器和处理器对代码进行重排序优化。

1.4 JMM 的特性

  • 内存可见性:当一个线程修改了共享变量的值,其他线程能够立即看到这个变化。

  • 指令重排序:JMM允许编译器和处理器对指令进行重排序,但是在多线程环境下保证最终的执行结果与串行一致性执行的结果一致。

  • happens-before:提供了一种 happens-before 关系,即前一个操作的结果对于后一个操作是可见的。这种顺序性规则用于确保正确的内存可见性。

1.5 并发编程与JMM的关系

  • 并发编程挑战:并发编程中常见的挑战包括竞态条件(Race Conditions)、死锁(Deadlocks)、内存可见性问题等。多线程并发访问共享资源时,会存在数据不一致、线程安全性等问题。

  • JMM关联:JMM定义了Java程序中多线程并发访问共享内存的规范。它规定了共享变量的可见性、有序性、原子性等特性,从而解决了并发编程中的一些问题。JMM提供了保证多线程间共享数据正确访问的规则和约束。

2. 主内存与工作内存

        Java内存模型(JMM)中的主内存和工作内存是为了描述多线程并发访问共享变量时的内存交互情况而定义的两个概念。

2.1 主内存(Main Memory)

  • 主内存是所有线程共享的内存区域。
  • 所有的共享变量都存储在主内存中。
  • 主内存是线程之间的公共资源池,所有线程都可以访问它。
  • 主内存中存储了对象实例、类信息、静态变量等数据。

2.2 工作内存(Working Memory)

  • 工作内存是每个线程独有的内存空间。
  • 每个线程都有自己的工作内存。
  • 工作内存中存储了线程运行时使用到的变量的副本。
  • 线程的操作(读写共享变量)都在工作内存中进行。

 

2.3 内存交互操作

        JMM规定了主内存和工作内存之间的交互操作,主要涉及两种操作:

  • 读取操作:当线程需要使用共享变量的值时,它会先从主内存中将变量的值复制到自己的工作内存中,然后执行操作。

  • 写入操作:当线程修改了共享变量的值后,它会先在自己的工作内存中修改这个变量,然后将变更同步到主内存中。

2.4 实现线程间通信

        主内存与工作内存的概念实现了线程间的通信机制,保证了多线程之间对共享变量的可见性、有序性和原子性操作。JMM规定了线程如何与主内存进行交互,从而保证了并发编程的正确性和稳定性。

 下面用一张图来看下JVM整体结构及内存模型

3. Happens-Before原则

        Happens-Before(先行发生,以下简称HB)是Java内存模型(JMM)中的一种规则或原则,用于确保多线程程序中操作的顺序性。它描述了在多线程环境中,对共享变量的操作顺序规则,从而确保正确的内存可见性和顺序性。

3.1 Happens-Before的定义

        Happens-Before原则规定了一系列操作之间的先后顺序关系。如果一个操作Happens-Before于另一个操作,那么前一个操作对于后一个操作的结果是可见的。

3.2 Happens-Before的规则

  • 程序顺序规则(Program Order Rule):在一个线程内,按照程序代码的先后顺序执行的操作,会产生Happens-Before的关系。

  • 锁定规则(Monitor Lock Rule):对于一个锁的解锁操作Happens-Before于后续对于该锁的加锁操作。

  • volatile变量规则:对一个volatile变量的写操作Happens-Before于后续对这个变量的读操作。

  • 传递性规则(Transitivity):如果操作A Happens-Before操作B,操作B Happens-Before操作C,则操作A Happens-Before操作C。

  • 线程启动规则(Thread Start Rule):线程的启动操作Happens-Before于新线程的所有操作。

  • 线程终止规则(Thread Termination Rule):线程的所有操作Happens-Before于其他线程检测到该线程终止。

3.3 应用场景

  • 保证顺序性:Happens-Before规则保证了对共享变量的写操作先于对该变量的读操作,保证了操作的顺序性。

  • 保证可见性:由于Happens-Before关系可以保证操作的先后顺序,因此一个线程对变量的修改操作对于其他线程来说是可见的。

  • 内存同步:Happens-Before规则提供了内存同步的机制,保证了多线程并发操作时内存数据的正确性和一致性。

Happens-Before原则是Java并发编程中重要的理论基础,它确保了多线程环境下对共享变量的操作顺序和可见性,帮助程序员编写正确、可靠的多线程并发程序。

4. Volatile关键字

volatile 是Java关键字,用于声明变量。它具有以下作用和特性:

4.1 作用和特性

  1. 可见性:保证变量的修改对其他线程是可见的。
  2. 禁止重排序:防止编译器和处理器对指令进行重排序优化。

4.2 保证可见性

  • 当一个变量被 volatile 关键字修饰时,对该变量的写操作会立即刷新到主内存,并且对该变量的读操作也会直接从主内存中读取,而不是从线程的工作内存中读取。
  • 这样可以确保一个线程对变量的修改对其他线程是立即可见的,避免了多线程环境下由于工作内存和主内存数据不一致而引发的问题。

4.3 禁止重排序

  • volatile 关键字可以禁止编译器和处理器对被修饰变量的读写操作进行重排序优化。
  • 这意味着对 volatile 变量的写操作不会被重排序到其他操作之后,也不会将其之前的操作重排序到它之后。
  • 同样,对 volatile 变量的读操作也不会被重排序到它之前的其他操作之后。

4.4 使用注意事项

  • volatile 适用于对变量的写操作不依赖变量的当前值,或者仅用于单一线程写、多线程读的情况。
  • 适用于标志位等频繁被读写的变量,而不适用于复合操作,如 i++ 操作。
  • volatile 并不能保证原子性操作,因此对于多线程并发修改同一变量时可能需要额外的同步控制。

4.5 Volatile的使用场景和注意事项

使用场景:
  • 状态标志位:在多线程中用作标识位,例如线程之间的控制标志位,确保不同线程之间状态的可见性。

  • 单一写、多线程读:一个变量被多个线程读取但只有一个线程写入,可以使用volatile来保证可见性。

  • Double-checked locking:在单例模式的双重检查锁定中,如果要求该单例实例对所有线程是可见的,可以将单例实例声明为volatile。

何时使用Volatile关键字:
  • 当需要保证对一个变量的修改对其他线程是立即可见的,并且变量的写操作不依赖于当前值时,可以考虑使用volatile关键字。

  • 如果多个线程共享一个变量,其中一个线程修改了该变量,需要确保其他线程能够及时看到该变量修改后的值时,可以选择使用volatile。

局限性和注意事项:
  • 不保证原子性:volatile只能保证可见性,不能保证操作的原子性。对于复合操作(例如i++),需要额外的同步控制才能确保原子性。

  • 不适用于线程安全的计数器:如果需要在多线程环境下进行自增等操作,应该使用Atomic类提供的原子操作而不是volatile。

  • 不保证操作的有序性:虽然volatile可以防止指令重排序,但并不能保证复合操作的有序性。

  • 并不能替代锁:volatile不能替代锁来确保原子性和线程安全,它适用于一些特定场景下的轻量级同步需求。

  • 谨慎使用:volatile的使用需要谨慎,不当的使用可能导致意想不到的结果,特别是对于复合操作和线程安全性的要求。

5. JMM与性能优化

        通过对Java内存模型(JMM)的理解,可以优化并发程序,提高性能和可靠性。以下是一些常见的性能优化技巧和最佳实践:

5.1. 减少锁竞争

  • 粒度控制:减小锁的粒度,使得锁的持有时间尽可能短,避免长时间的锁竞争。

  • 分离锁:如果不同的数据可以使用不同的锁,可以将锁分离以减少不同数据间的锁竞争。

5.2. 使用局部变量

  • 局部变量优于共享变量:尽可能使用线程本地的局部变量,减少对共享变量的访问。

5.3. 使用非阻塞算法

  • CAS(比较并交换):使用CAS替代锁,例如Atomic类提供的原子操作。

5.4. 合理使用线程池

  • 线程池调优:根据实际场景调整线程池的大小,避免线程数量过多或过少导致的资源浪费或性能瓶颈。

5.5. 避免过度同步

  • 避免不必要的同步:只对需要保护的共享数据进行同步,避免过度同步。

5.6. 缓存优化

  • 缓存策略:合理选择缓存数据的策略,避免缓存过期导致的大量并发请求。

5.7. 并发数据结构

  • 使用并发容器:使用ConcurrentHashMap、ConcurrentLinkedQueue等并发数据结构,避免手动加锁。

5.8. 内存优化

  • 对象池:复用对象,减少对象的创建和销毁,降低内存开销。

  • 减少内存泄漏:确保不再使用的对象能够被垃圾回收,避免内存泄漏问题。

5.9. 测试与监控

  • 压力测试:对并发程序进行压力测试,发现并发瓶颈,并针对性地优化。

  • 性能监控:使用工具监控程序的性能指标,定位性能瓶颈,例如使用VisualVM、Arthas等进行性能分析。

6. 总结

        Java内存模型(JMM)在Java并发编程中具有重要性,它定义了多线程并发访问共享内存时的规范,为开发高性能、可靠性的并发程序提供了必要的保证和指导。最后我们再总结一下Java内存模型的作用

  • 保证可见性和一致性

    JMM规定了共享变量的读写规则,确保一个线程对共享变量的修改对其他线程是可见的,避免了数据不一致的情况。
  • 确保顺序性和有序性

    JMM通过Happens-Before规则规定了操作的顺序关系,保证了程序中操作的执行顺序,避免了指令重排序带来的问题。
  • 提供原子性保证

    JMM通过synchronized、volatile等机制提供了对共享变量操作的原子性保证,避免了线程安全问题。
  • 避免竞态条件和死锁

    JMM的规范和约束减少了竞态条件和死锁等并发编程中常见的问题,提高了程序的稳定性和可靠性。
  • 指导并发程序设计

    对JMM的理解有助于开发人员设计更安全、更高效的并发程序。合理使用同步机制、了解内存交互规则可以更好地优化程序性能。
  • 对高性能程序的重要性

    在需要高性能、高并发的场景下,对JMM的理解和合理运用可以避免潜在的并发问题,提高程序的性能和稳定性。
深入理解Java虚拟机——JMM(Java内存模型) CPU的执行速度和内存的读取速度差距越来越大,导致CPU每次操作内存都要耗费很多等待时间。为解决这个问题,早期的程序员大佬提出了“CPU和物理内存上新增高速缓存”。将运算所需要的数据从主内存复制一份到CPU的高速缓存中,当CPU进行计算时就可以直接从高速缓存中读数据和写数据了,当运算结束再将数据刷新到主内存就可以了。 阅读详情

相关推荐

Java内存模型-清晰剖析

Java 内存模型(JMM)指定了Java 虚拟机(JVM)如何与计算机内存RAM) 配合使用。由于Java虚拟机与内存交互的时候,是通过Java线程去做的,因此Java内存模型其实就是针对Java的线程模型进行研究的,因此Java内存模型其实也叫“Java线程模型。Java 内存模型(JMM) 控制Java 中的线程如何与内存交互。它保证一个线程所做的更改对其他线程可见,即Java 内存模型(JMM) 可以指定不同线程如何以及何时可以看到其他线程写入共享变量的值,从而为安全的多线程提供框架。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2916

JMM(Java内存模型)详解

1.什么是JMM? ​ JMM 是Java内存模型( Java Memory Model),简称JMM。它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。 ​ 计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过

LYQ20010417的博客 3万+

【Python爬虫案例教学】超简洁代码采集原神所有角色信息

(。・∀・)ノ゙嗨 大家好,这里是池鱼

xiaoyuan_____的博客 2419

Java内存模型

从Java代码到CPU指令的变化过程是怎样的?最开始,我们编写的Java代码,即*.Java文件在执行编译Javac命令后,从刚才的*.Java文件会变出一个新的Java字节码文件,即*.class文件JVM会执行刚才生成的*.class字节码文件,并把字节码文件转化为机器指令机器指令可以直接在CPU上执运行,也就是最终的程序执行。

Qynwang的博客 3953

炸金花游戏(3)--基于EV(期望收益)的简单AI模型

前言:   炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章:  德州扑克AI--Programming Poker AI(译).  系列文章说来惭愧, 之前一直叫嚷着写德州AI, 不过可惜懒癌晚期, 一直没去实践, T_T. 相比而言,***简单很多, 也更偏重于运...

weixin_30377461的博客 2340

用Multisim和74192芯片复刻经典:手把手教你搭建篮球24秒违例计时器(附仿真文件)

本文详细介绍了如何使用Multisim仿真平台和74192芯片构建篮球24秒违例计时器,涵盖时序逻辑电路设计、核心器件选型、仿真环境搭建及调试技巧。通过分步指导,帮助读者掌握数字电路设计的关键技术,并附赠仿真文件供实践参考。

weixin_27014595的博客 277

Java内存模型—JMM详解

JMM

可达鸭的博客 3643

Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)

导语 "慢品人间烟火色 闲观人间岁月长" ———致自己​​​ ​ ???? 遇见我以后,我们的故事就开始了,愿你历经山河,仍觉得人间值得????。 ​ 星光月夜烟花皆归你,我也归你。关于烟花????大家都​知道多少?有多少表白故事情节都发生在烟 花下,想必木木子????不用说大家也知道叭~​​ 今天这则小短文就是关于烟花的故事!你准备好跟我一起进入烟花的世界了嘛? ​正文 “每一句文案,都有一个故事,你仔细听” ​ 1)环境安装???? 准备好:.

顾木子吖的博客 5万+

Java 内存模型(JMM)详解

在Java的多线程编程中,如何确保线程间共享变量的可见性和同步是一个关键问题。Java内存模型(Java Memory Model, JMM)正是为解决这些问题而设计的。本文将简要介绍JMM的基本概念、工作原理及其在多线程编程中的作用。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6667

mipi deskew原理理解

何为skew, 从字面意思看是倾斜了,不对齐了;放在mipi的传输中意思就是clock lane和data lane 及data lane与data lane间出现了相位差;一旦出现相位差,大家采样数据时就可能不在同一个节拍上,会出现传输错误。所以就要做deskew,通过做deskew来使得大家重新对齐,在同一个节奏下传输数据. 一般当data rate高于1.5G时建议开启deskew。

lx123010的专栏 8089

WQ7033开发指南(应用篇)之2.1 主函数详解(1)

整个系列文章查看: ​​​​​​WQ7033开发指南汇总 目录 1.函数模块位置 2.函数main_chip_init()解析 2.1 cal_data_ana_load() 2.2 函数iot_cache_restore_register()解析 3.函数iot_soc_chip_init()解析 3.1 soc芯片初始化的低功耗使能 3.2 分支预设功能使能 3.3 数据异常中止使能 3.4 外围低速总线访问路径使能 3.5 1.8V DCDC功能配置 3.6 ADC配..

心跳包的博客 802

JMM(Java内存模型)详解

为了对上面的问题进行更深入的探究,我有查了一些JIT相关的资料。简单总结下JIT然后再对上面的问题分析下。JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一个关键组件,它负责在程序运行过程中动态地将字节码(即Java编译后的.class文件中的代码)转换为特定于平台的机器代码。这一过程旨在提高程序的执行效率,因为它能够针对运行时的数据和实际使用模式进行优化,而不仅仅是基于静态代码分析。JIT工作原理加载与解释执行:当Java程序启动时,JVM首先加载类文件并由解释器执行字节码。

落日的博客 4170

30分钟用 Restful ABAP Programming(RAP)模型开发一个支持增删改查的 Fiori 应用

2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Driven Development,即通过开发维护了对应annotation(注解)的CDS view,结合SAP WebIDE,能够花费最少的编程代价,就能够在短时间内获得一个支持增删改查的Fiori应......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5947

JMM详解(Java内存模型)

一开始就需要情调一下,JMM与JVM是两个概念,JVM指的是JVM虚拟机,但是JMM指的是Java内存模型!!!!!!当然JVM内存模型与JMM内存模型也不是一个东西!!!!以下是我个人对JMM的理解,希望和大家一起探讨!

多敲代码防脱发的博客 826

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java内存模型(JMM)详解

为什么要有内存模型 在现代多核处理器中,每个处理器都有自己的缓存,定期的与主内存进行协调。 想要确保每个处理器在任意时刻知道其他处理器正在进行的工作,将需要很大的开销,且通常是没必要的。 硬件的效率与一致性 由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算...

牧小农 4510

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java内存模型(JMM)详解

转载于: 面试官:说说什么是Java内存模型?为什么要有内存模型? 要想回答这个问题,我们需要先弄懂传统计算机硬件内存架构。好了,要开始画图了 硬件内存架构图 含有一二三级架构的内存架构图 去过机房的同学都知道,一般在大型服务器上会配置多个CPU,每个CPU还会有多个核,这就意味着多个CPU或者多个核可以同时(并发)工作。如果使用 起了一个多线程的任务,很有可能每个 都会跑一个线程,那么你的任务在某一刻就是真正并发执行了。也就是 。是 内部集成的,在寄存器上执行操作的效率要比在主存上高出几个数量级在中

thlzjfefe的博客 1356

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java内存模型 JMM详解

什么是JMM模型 JMM是一种抽象的概念,并不真实存在,是一组规范或者规则;关注的是多个线程对共享内存空间和线程私有工作空间的访问方式,围栏并发的原子性、有序性、可见性来展开的,想要了解JAVA的并发编程,就应该理解JMM。 JMM通过定义了对变量(包括实例成员、静态成员和组成数组对象的元素)的访问方式,在程序运行时,运行程序的是实体是线程,每个线程创建时候,虚拟机都会为每个线程分配一定的内存空间,每个线程的内存空间用来存储线程私有的数据。但是JMM中规定数据都是存储在共享的主内存空间,而且每个线.

Angus 1380

Java内存模型(JMM)详解!

JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JMM可以理解为是一个规范,一个抽象概念,并不真实存在。

追寻心的步伐 1716

详解JMM——java内存模型

摘要: CPU缓存通过三级结构(一二级私有、三级共享)解决CPU与内存速度不匹配问题,内存则缓解磁盘访问慢的问题。Java内存模型(JMM)抽象了线程与主内存的关系,定义主内存(存储共享数据)和本地内存(线程私有副本),通过8种操作(如read/write、lock/unlock)实现交互。JMM还提出happens-before原则确保指令顺序性和可见性,包括程序顺序、volatile变量、线程启动等规则,允许重排序但需保持结果一致性,以支持跨平台并发安全。

jrbbad的博客 1479

JMM(Java 内存模型)详解

Java 是最早尝试提供内存模型的编程语言。由于早期内存模型存在一些缺陷(比如非常容易削弱编译器的优化能力),从 Java5 开始,Java 开始使用新的内存模型。一般来说,编程语言也可以直接复用操作系统层面的内存模型。不过,不同的操作系统内存模型不同。如果直接复用操作系统层面的内存模型,就可能会导致同样一套代码换了一个操作系统就无法执行了。Java 语言是跨平台的,它需要自己提供一套内存模型以屏蔽系统差异。这只是 JMM 存在的其中一个原因。

m0_53157173的博客 886

【Java锁体系】七、JMM内存模型详解

【Java锁体系】七、JMM内存模型详解 JMM是Java的内存模型,与Java的内存区域(运行时数据集区域)是不同的,是两个完全的概念。 Java内存模型JMM:解决多线程下,线程间通信的类似的问题; JVM运行数据区:对象内存自动化管理。 7.1 为什么要存在JMM这抽象概念? 由于JVM运行程序的实体是线程,而每个线程创建时都会为其创建一个工作内存(有些地方称之为栈空间)用于存储线程私有的数据,线程与主内存中的变量操作必须通过工作内存间接完成,主要过程是讲变量从主内存拷贝到每个线程各自的工作内存空间,

Mind_programmonkey的博客 615

JAVA内存模型(JMM)详解

引言 为了更好的了解底层原理,写出更加高效的代码,今天我们 详细的分析一下JAVA内存模型(JMM),JAVA内存模型是我们深入了解java并发变成的先决条件。对于后续多线程 中的线程安全,同步异步处理等更是大有裨益。 硬件内存架构 在学习java内存模型之前,先了解一下计算机硬件模型,我们都知道处理器与计算机存储设备运算速度有几个数量级的差别。总不能让处理器一直等待计算机存储设备,这样就没...

Jack 架构师之路 1079

Java 内存模型JMM详解

Java 内存模型JMM详解JMM简介重排序规则final字段内存屏障HappenBefore JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性、是否可以重排序等问题的无关具体平台的统一的保证。(可能在术语上与Java运行时内存分布有歧义,后者指堆、方法区、线程栈等内存区域)。 并发编程有多种风格,除了CSP(通信顺序进...

春来桃花开的博客 621
上一篇: Redis为何如此快速?
下一篇: 深入理解Mysql事务隔离级别与锁机制
Memory_2020
Memory_2020 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄10年 5598粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memory_2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值