java 内存模型
定义#
Java内存模型(Java Memory Model,JMM)是一组规范,用于屏蔽各种硬件和操作系统的内存访问差异,确保Java程序在各种平台上都能达到一致的内存访问效果。其主要目的是解决多线程编程中的两个关键问题:可见性和有序性。
组成#
主内存#
所有线程共享的内存区域,存储所有的实例变量、静态变量和数组元素。主内存是Java堆的一部分。
工作内存#
每个线程都有自己的工作内存,用于保存从主内存中拷贝的变量的副本。线程对变量的所有操作(如读取、赋值)都在工作内存中进行,而不是直接操作主内存。线程之间的通信必须通过主内存来完成。
特性#
原子性#
指一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行
可见性#
可见性指的是一个线程对共享变量的修改对其他线程何时可见。在没有同步的情况下,线程可能会将变量的值缓存在CPU寄存器或线程本地缓存中,导致其他线程读取到旧值。JMM通过同步机制确保当一个线程修改了共享变量的值,其他线程能立即看到最新的值。
有序性#
有序性是指程序中操作的执行顺序。在单线程环境中,操作的顺序与代码顺序一致。但在多线程环境中,编译器和处理器可能会对指令进行重排序以优化性能,这可能导致操作的实际执行顺序与代码顺序不一致。JMM通过插入内存屏障来控制这种重排序,确保多线程环境下的操作顺序与程序员的预期一致。
重排序的定义和类型#
为了优化性能,Java编译器和CPU在执行程序时可能会对指令进行重排序。重排序可以分为三种类型:
1、编译器重排序:编译器在编译代码时可能会改变语句的顺序。
2、指令级并行重排序:处理器在执行指令时,可以并行执行多条指令,并可能会调整这些指令的执行顺序。
3、工作内存重排序:线程在工作内存中对变量的操作可能会被重排序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)