栈中基本类型存值、引用类型存地址;线程栈独立故不共享,但引用类型指向堆中同一对象导致并发问题;逃逸分析决定线程安全:未逃逸则私有安全,逃逸则可能共享不安全;传参时基本类型传值副本,引用类型传地址副本。

栈中存储内容不同
基本类型变量在栈中直接存值,比如 int a = 10,栈里就实实在在放着数字 10;引用类型变量在栈中只存一个地址,比如 StringBuilder sb = new StringBuilder(),栈里放的是指向堆中那个对象的一串内存地址。
线程间是否共享的逻辑差异
每个线程都有独立的栈空间,所以栈里的东西天然不共享。但关键区别在于:
- 基本类型值被复制进栈后,就是一份独立副本,改它不影响别的线程
- 引用类型虽然地址是独立的,但它指向的是堆中同一个对象——而堆是所有线程共用的
逃逸与否决定安全边界
一个引用类型对象是否线程安全,核心看它有没有“逃出”当前栈帧:
- 仅在方法内创建、使用、销毁(如局部 new StringBuilder()),没传参、没返回、没赋给成员变量 → 不逃逸 → 实际上等效于线程私有 → 安全
- 作为参数传入、作为返回值传出、或赋给类的字段 → 逃逸 → 多个线程可能通过不同路径访问同一堆对象 → 不安全
传参时的行为表现
函数调用时,栈帧之间传递数据的方式凸显本质差异:
- 传基本类型(如 int x):拷贝的是数值本身,形参修改不影响实参
- 传引用类型(如 StringBuilder sb):拷贝的是地址值,形参和实参指向堆中同一对象,修改对象状态会影响所有持有该地址的地方

















