You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java内部类运行线程时 是否和其他内部类线程共享外部类同一份字段?

问题结论

所有内部类线程是否共享同一份外部类字段,取决于你用来创建内部类实例的外部类对象是否是同一个,对应你给出的代码场景可以分两种情况讨论:


核心原理铺垫

Java中的非静态内部类(你代码中的Inner类就是非静态内部类)会隐式持有创建它的外部类实例的引用,你在外部类的非静态方法makeNewThread中执行new Inner()时,生成的Inner对象会自动绑定当前这个正在调用makeNewThread的Outer类实例。
你疑惑的线程独立栈的问题不影响成员字段的共享逻辑:线程栈仅存储局部变量、方法调用帧、基本类型值以及对象的引用地址,所有对象的成员字段都是存储在堆内存中的,不会在线程栈中单独复制一份副本。


场景1:同一个Outer实例反复调用makeNewThread()

比如你执行以下代码:

Outer outer = new Outer();
outer.makeNewThread();
outer.makeNewThread();
outer.makeNewThread();

这种情况下所有生成的Inner实例绑定的都是同一个outer对象,所有线程访问的counter都是这个outer对象在堆中存储的同一份字段,完全共享。

注意:这种场景下多线程并发读写counter会存在竞态条件和可见性问题,需要加锁或者替换为java.util.concurrent.atomic.AtomicInteger保证线程安全。


场景2:每次new新的Outer实例再调用makeNewThread()

比如你执行以下代码:

new Outer().makeNewThread();
new Outer().makeNewThread();
new Outer().makeNewThread();

这种情况下每个Inner实例绑定的是不同的Outer实例,每个Outer实例的counter是堆中独立的存储单元,所以各个线程的counter互不影响。


内容的提问来源于stack exchange,提问作者Mason Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:15:05