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

静态内部类方法内的局部变量是否会在多线程间共享?

问题解答

1. int类型的local变量不会在线程间共享

无论局部变量属于静态内部类还是普通类的成员方法,只要是方法内部声明的基础类型局部变量,都遵循JVM内存模型的栈内存分配规则:
每个线程拥有独立的虚拟机栈,每次方法调用都会在当前线程的栈中创建一个独立的栈帧,方法内的局部变量就存储在当前栈帧的局部变量表中,仅对当前执行方法的线程可见,其他线程无法访问,完全不存在共享的可能。
你问题里的local变量就属于这一类,哪怕多个线程同时调用method1,每个线程都会有自己的local副本,互相之间完全没有影响。

2. 两个线程同时调用method1的内存分布

我们分两种常见场景说明内存分布:

场景1:两个线程调用同一个SharedClass实例的method1

  • 堆内存:存储SharedClass的实例对象,实例的成员变量a随对象存储在堆中,属于线程共享区域,两个线程访问的是同一个a变量
  • 各线程的虚拟机栈:
    • thread1的虚拟机栈中存在对应method1调用的栈帧,栈帧的局部变量表中存储自己的local副本,初始值为0,自增后变为1
    • thread2的虚拟机栈中存在对应method1调用的独立栈帧,栈帧的局部变量表中存储自己的local副本,初始值为0,自增后变为1
  • 元空间(方法区):存储SharedClass的类元信息,属于线程共享区域,所有该类的实例共享同一份类元数据

注意:该场景下虽然local不存在线程安全问题,但成员变量a是共享的,若后续代码逻辑调整为local基于原a的值计算(比如int local = a;),就会出现线程安全问题,需要加同步机制保证可见性和原子性。

场景2:两个线程调用各自的SharedClass实例的method1

除堆内存会存储两个独立的SharedClass实例,各自的成员变量a分别归属于不同实例、不存在共享之外,其余内存分布和场景1完全一致,local变量依然是各线程私有。

相关代码

private static class SharedClass {
        int a = 0;

        public void method1() {
            int local = 0;
            local++;
            a=local;
        }
   }

内容的提问来源于stack exchange,提问作者Shambhavi Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:54:03