Kotlin `?.let` 是线程安全的吗?

Is Kotlin `?.let` thread-safe?

Kotlin ?.let 线程安全吗?

假设 a 变量可以在不同线程中更改。 使用 a?.let { /* */ } 线程安全吗?如果它等于 if (a != null) { block() } 是否会发生在 if 中它不为空而在 block 中它已经为空?

a?.let { block() } 确实等同于 if (a != null) block().

这也意味着如果a是一个可变变量,那么:

  1. 如果 a 是一个可变变量,它可能会在空检查后重新分配,并在 block() 执行期间的某个时刻保持 null 值;

  2. 所有与并发相关的效果都起作用,如果 a 在线程之间共享以避免竞争条件,则需要适当的同步,如果 block() 访问 a 再次;

然而,由于 let { ... } 实际上将其接收者作为单个参数传递给它所采用的函数,它可用于捕获 a 的值并在 lambda 中使用它而不是访问属性 又在 block()。例如:

a?.let { notNullA -> block(notNullA) }

// with implicit parameter `it`, this is equivalent to:
a?.let { block(it) }

此处,作为参数传递到 lambda 的 a 的值保证与检查是否为 null 的值相同。但是,在 block() 中再次观察 a 可能 return 为空值或不同的值,并且观察给定实例的可变状态也应该正确同步。