静态内部类方法内的局部变量是否会在多线程间共享?
问题解答
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
- thread1的虚拟机栈中存在对应
- 元空间(方法区):存储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
相关产品推荐
相关产品推荐

