外观
一句话答案
JMM 规定线程的工作内存与主内存的交互规则,通过 volatile/synchronized/final 保证可见性、有序性和原子性。
核心要点
Java 有 8 种基本数据类型:
| 类型 | 字节 | 范围 | 默认值 | 包装类 |
|---|---|---|---|---|
byte | 1 | -128 ~ 127 | 0 | Byte |
short | 2 | -32768 ~ 32767 | 0 | Short |
int | 4 | -2^31 ~ 2^31-1 | 0 | Integer |
long | 8 | -2^63 ~ 2^63-1 | 0L | Long |
float | 4 | 单精度浮点 | 0.0f | Float |
double | 8 | 双精度浮点 | 0.0d | Double |
char | 2 | 0 ~ 65535(Unicode) | '\u0000' | Character |
boolean | 1(理论,JVM 实现依赖) | true/false | false | Boolean |
常见追问:
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比值。