JMM如何限定Lambda及局部/匿名类中局部变量的使用?
Java内存模型(JMM)对Lambda、局部类/匿名类中局部变量的约束问题
核心认知困惑
- 不清楚JMM如何限定Lambda表达式、局部类及匿名类中局部变量的使用规则
- 已知Java语言规范(JLS)明确:局部变量、方法形参、异常处理参数不属于共享变量,不会在线程间共享,也不受JMM的直接影响,但对这类变量的具体性质仍有模糊点
示例场景的具体疑问
针对如下Test1代码逻辑:
public class Test1 { public static void main(String[] args) { var i = 10; Thread thread1 = new Thread(() -> System.out.println(i)); thread1.start(); } }
- 疑问:Lambda中的
System.out.println(i)是否存在输出0的可能性? - 推导假设:如果i是共享变量,由于main线程的
var i=10赋值操作与thread1线程的输出操作之间没有happens-before关系,理论上可能读取到变量的默认初始值0;但i并非共享变量,因此无法确定实际输出结果
解答诉求与解决途径
- 此前找到的被标记为重复的问题答案,因缺乏Java官方规范的直接依据,无法满足需求,希望从Java语言规范层面获取权威证明
- 后续通过Holger用户提供的官方规范相关内容,得到了符合要求的解答
内容的提问来源于stack exchange,提问作者user21774510
相关产品推荐
相关产品推荐

