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

为什么Kotlin中的?.let能在多线程环境下避免空指针异常?

为什么Kotlin的?.let能在多线程环境下避免空指针异常?

先拆解核心逻辑:

  • Kotlin的?.是安全调用运算符,执行逻辑是:先检查左侧变量是否为非null,只有确认非null时,才会执行后面的函数(这里就是let),同时把当前这个非null的对象引用,传递给let的lambda参数it。
  • 你给出的例子里,子线程执行demo?.let时,会先读取demo的当前值(也就是那个Demo()实例),确认非null后,直接把这个实例的引用赋值给it。这时候it就成了lambda内部的局部变量,和外部的demo变量彻底解绑了。

所以主线程后续把demo设为null,只是修改了demo这个变量存储的引用地址,让它不再指向原来的Demo对象,但it已经持有了原对象的引用,完全不受demo变量变化的影响。

至于你问的是不是深拷贝?当然不是。it和原来的demo指向的是同一个对象,只是it是局部变量,持有了对象的引用,只要这个引用还存在,对象就不会被垃圾回收,子线程自然能一直调用it.run()。

打个通俗的比方:就像你手里有一把钥匙(demo变量),打开了一扇门(Demo对象),然后你把钥匙扔了(demo = null),但你已经进到屋里了(it持有对象引用),完全不影响你在屋里活动(调用run())。

内容的提问来源于stack exchange,提问作者Mirai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:15:32