multithreading - Kotlin `?.let` 是线程安全的吗?
问题描述
Kotlin?.let
线程安全吗?
假设a
变量可以在不同的线程中更改。使用a?.let { /* */ }
线程安全吗?如果它等于if (a != null) { block() }
它是否会发生if
它不是空的并且block
它已经是空的?
解决方案
a?.let { block() }
确实相当于if (a != null) block()
。
这也意味着 ifa
是一个可变变量,那么:
a
可能在空检查后重新分配,并在执行null
时保持一个值block()
;所有与并发相关的效果都有效,如果在线程之间共享,则需要适当的同步
a
以避免竞争条件;
但是,由于let { ... }
实际上将其接收器作为单个参数传递给它所采用的函数,它可以用于捕获 lambda 的值a
并在 lambda 中使用它,而不是在block()
. 例如:
a?.let { notNullA -> block(notNullA) }
// with implicit parameter `it`, this is equivalent to:
a?.let { block(it) }
在这里,a
作为参数传递给 lambda 的值保证与检查为 null 的值相同。但是,a
再次观察block()
可能会返回 null 或不同的值,并且观察给定实例的可变状态也应该正确同步。
推荐阅读
- ruby-on-rails - 如何导出全局scss变量文件以导入Rails 6 webpacker中的所有scss文件
- assembly - MOV 8 位到 16 位寄存器(al 到 bx)
- powerbi - 前几个月的 Power BI 累计和
- swift - 使用 Swift Package Manager 的 Swift IOS 库无法编译
- winforms - ContextMenuStrip 中的嵌套子菜单
- gitlab - GitlabCI:触发管道
- c# - 复杂的 linq 语句 - 嵌套组/where/sum/select
- snakemake - 如何从 config.yaml 分配多个路径?
- scala - 2个案例类的匹配值
- angular - 在 primeNg 下拉列表中使用 overlayVisible 属性