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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:59:55