Skip to content
进阶

一句话答案

JMM 规定线程的工作内存与主内存的交互规则,通过 volatile/synchronized/final 保证可见性、有序性和原子性。

核心要点

Java 有 8 种基本数据类型:

类型字节范围默认值包装类
byte1-128 ~ 1270Byte
short2-32768 ~ 327670Short
int4-2^31 ~ 2^31-10Integer
long8-2^63 ~ 2^63-10LLong
float4单精度浮点0.0fFloat
double8双精度浮点0.0dDouble
char20 ~ 65535(Unicode)'\u0000'Character
boolean1(理论,JVM 实现依赖)true/falsefalseBoolean

常见追问:

Integer 缓存池(IntegerCache):Integer.valueOf(-128 ~ 127) 返回缓存对象,== 比较为 true;超出范围的 new Integer 是不同对象。

java
Integer a = 127, b = 127;
a == b;   // true(缓存池)

Integer c = 128, d = 128;
c == d;   // false(超出缓存范围,各自 new)
c.equals(d);  // true(比较值)
追问与易错

追问方向:

  • JMM 和 JVM 内存结构什么关系?(JMM 是规范定义可见性/有序性,JVM 内存结构是实现)
  • volatile 怎么保证可见性的?(写时刷新到主内存,读时从主内存加载)
  • 什么是指令重排?什么情况下会有问题?(单线程无影响,多线程可能看到中间状态)

易错点:

  • ❌ 混淆 JMM(Java Memory Model)和 JVM 内存结构(堆/栈/方法区)
  • ❌ "volatile 能保证原子性"——只保证可见性和有序性,i++ 仍不是原子的

💡 记忆锚点

8种基本类型按字节记:byte1 short2 int4 long8 / float4 double8 / char2 boolean1。Integer缓存-128到127像门牌号复用,超范围各new各的,所以==比地址会翻车,永远用equals比值。