当前位置: 首页 > news >正文

lambda的变量捕获机制

https://blog.csdn.net/weixin_69059394/article/details/155944312?spm=1001.2014.3001.5502
上述博客的进程中断中提到了lambda的变量捕获机制。

public class demo6 { public static boolean isFinished=false; public static void main(String[] args) throws InterruptedException { Thread t=new Thread(()->{ while(!isFinished){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } System.out.println("t线程结束"); }); t.start(); Thread.sleep(5000); isFinished=true; } }

什么是lambda变量捕获机制?

在lambda表达式中,如果引用了外部的局部变量,那么该变量必须是事实最终(effectively final)的。

什么是事实final?

// 明确的 final final int x = 10; // 事实 final - 初始化后没有修改 int y = 20; // 如果这里再有 y = 30; 就不是事实 final 了 // Lambda 可以捕获事实 final 的变量 Runnable r = () -> System.out.println(x + y);

而我在编写原子类AtomicInteger的使用的时候发现了如下问题:

//编写代码, 基于 AtomicInteger 实现多线程自增同一个变量 public class demo2 { //public static AtomicInteger sum = new AtomicInteger(); public static void main(String[] args) throws InterruptedException { AtomicInteger sum = new AtomicInteger(); Thread t1 = new Thread(() -> { for (int i = 0; i < 5000; i++){ sum.getAndIncrement(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 5000; i++){ sum.getAndIncrement(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(sum); } }

我发现将sum初始化在main方法中作为局部变量的时候,程序仍能够运行成功。

按理说这里的lambda应该触发变量捕获机制,sum值是被修改过的,程序应该报错才对。

这是由于我们创建的sum是引用数据类型!

AtomicInteger sum = new AtomicInteger(); // sum 是一个引用变量,指向 AtomicInteger 对象 Thread t1 = new Thread(() -> { for (int i = 0; i < 5000; i++) { sum.getAndIncrement(); // ✅ 修改对象状态,不是修改引用 } }); // sum 的引用没有改变过,是事实 final 的 // sum = new AtomicInteger(); // ❌ 如果加上这行,lambda 就不能捕获了
http://www.cnnetsun.cn/news/465295.html

相关文章:

  • 掌握核心!如何成为优秀提示工程架构师
  • 提示工程数据坑:架构师视角下的6个数据质量导致的失败案例
  • Video标签始终有一层半透明前景怎么办?实战排查(踩坑)记录
  • SamOutVXP-2601: 轻量级高效语言模型
  • Springboot如何解决跨域问题?
  • 微服务架构下的高可用保障:RuoYi-Cloud中Sentinel与Feign的完美融合
  • 深度解析Apache RocketMQ:从核心原理到实战应用
  • 智能体迈入 Agent RL 新架构时代?
  • 深度学习计算机毕设之基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于python的遥感图片识别沙漠湖泊和森林
  • 计算机深度学习毕设实战-基于pythonCNN深度学习的遥感图片识别沙漠湖泊和森林基于CNN深度学习的遥感图片识别沙漠湖泊和森林
  • 深度学习毕设选题推荐:基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于pythonCNN深度学习的遥感图片识别沙漠湖泊和森林
  • 一个http请求的过程
  • 写论文软件哪个好?宏智树AI用“真实+可靠+全流程”重新定义毕业论文辅助工具
  • 编写好的代码,AI 才会奖励你
  • 设备管理是操作系统的重要组成部分,其定位在于协调和控制计算机系统中的各类硬件设备
  • 网络安全渗透面试十题以及答案,从零基础入门到精通,收藏这一篇就够了!
  • JavaScript数组方法大全(按场景分类总结)
  • 空调智能插座从单向控制到闭环管理的技术体系创新
  • python基于django的户外救援系统_jdzgi247
  • 无法定位软件包 qt6-base-dev
  • 在AI原生应用领域持续学习,成就非凡自我
  • paperzz 开题报告:开题答辩的 “通关辅助器”,2 步搞定报告 + PPT 双输出
  • DeepSeek-OCR本地部署(上):CUDA 升级12.9,vLLM升级至最新稳定版
  • 基于微信小程序的体育场馆预约平台设计与实现(源代码+文档+PPT+调试+讲解)
  • 基于Android的校园互助平台-计算机毕业设计源码+LW文档
  • day 50
  • 基于 VSC 的 UPFC(统一潮流控制器)研究附Simulink仿真
  • LangChain核心组件之Tools
  • 环境仿真软件:SWAT_(8).SWAT软件的安装与配置
  • R MySQL 连接