线程间内存共享疑问:ParallelStream中局部变量a的引用是否冲突?
线程局部变量与对象引用问题解析
问题场景
现有如下Java代码(SomeArray包含100个元素):
ArrayList SomeArray = new ArrayList(); ForkJoinPool forkJoinPool = new ForkJoinPool(8); forkJoinPool.submit(() -> { SomeArray.parallelStream().map(e -> { A a = new A(); // 执行一些操作 }); }); class A { }
提问者的核心困惑:
线程1的a变量与线程2的a变量是否指向同一内存引用?并提出两种假设:
- 情况1:若线程共享同一内存,线程2创建新对象后,共享的
a引用会指向新对象,导致线程1的操作切换到新对象 - 情况2:若线程将变量
a存储在局部内存中,两个线程会创建不同对象,a引用彼此无重叠
结论与解释
每个线程的a都是独立的局部变量,彼此完全不重叠,绝不会指向同一内存引用,情况2是正确的。
具体解释:
map方法中的Lambda表达式属于独立的执行单元,A a = new A();定义的a是该Lambda的局部变量,会存储在对应线程的私有栈内存中。- 当parallelStream通过多线程处理元素时,每个线程会在自己的栈帧中创建属于自己的
a变量,并且每个a都会指向堆内存中一个全新的A实例。 - 线程的栈内存是完全私有的,不存在“共享局部变量”的情况,情况1的假设不成立:线程2的
a和线程1的a是两个完全不同的变量,彼此不会产生任何干扰。 - 由于每个线程操作的都是自己独立的
A对象和局部引用a,因此不会出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Shivansh Bajpai
相关产品推荐
相关产品推荐

