CPU 高速缓存
CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。现代的 CPU Cache 通常分为三层,分别叫 L1,L2,L3 Cache。 先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 主存中。这样就导致存在内存缓存不一致性的问题 。CPU 为了解决内存缓存不一致性问题可以通过制定缓存一致协议(比如 MESI 协议)或者其他手段来解决。内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。
指令重排序
系统在执行代码的时候并不一定是按照你写的代码的顺序依次执行。Java 源代码会经历 编译器优化重排 —> 指令并行重排 —> 内存系统重排 的过程,最终才变成操作系统可执行的指令序列。指令重排序可以保证串行语义一致,但是不能保证多线程间的语义也一致 。
为什么需要Java内存模型?
JMM 可以看作是 Java 定义的并发编程相关的一组规范,除了抽象了线程和主内存之间的关系之外,其还规定了从 Java 源代码到 CPU 可执行指令的这个转化过程要遵守和并发相关的原则和规范,其主要目的是为了简化多线程编程,增强程序可移植性。
主内存和本地内存的概念
主存是所有CPU核心共享的存储区域。主存中的数据可以被所有CPU核心访问和共享,是多个线程或进程之间进行通信和数据共享的主要方式。本地内存(也称为线程栈内存)是指每个线程私有的内存空间,用于存储线程栈和线程本地变量。本地内存存储了该线程以读 / 写共享变量的副本。
Java内存模型
多线程并发过程中,对主存中的共享变量进行操作有可能诱发线程安全问题。 Java 内存模型定义了主内存与工作内存直接的具体交互协议来确保同步操作的正确执行。
Java内存区域和Java内存模型的区别?
Java内存区域 | Java内存模型 | |
性质 | Java内存区域和 Java 虚拟机的运行时区域相关 | Java 内存模型和并发编程相关 |
功能 | 分区存储程序数据 | 简化多线程编程,增强程序可移植性 |
Java并发编程的三个重要特性
1. 原子性
2. 可见性
3. 有序性
注意:volatile
关键字能保证变量的可见性,但不能保证对变量的操作是原子性的