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
是一个可变变量,那么:
如果 a
是一个可变变量,它可能会在空检查后重新分配,并在 block()
执行期间的某个时刻保持 null
值;
所有与并发相关的效果都起作用,如果 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 为空值或不同的值,并且观察给定实例的可变状态也应该正确同步。
Kotlin ?.let
线程安全吗?
假设 a
变量可以在不同线程中更改。
使用 a?.let { /* */ }
线程安全吗?如果它等于 if (a != null) { block() }
是否会发生在 if
中它不为空而在 block
中它已经为空?
a?.let { block() }
确实等同于 if (a != null) block()
.
这也意味着如果a
是一个可变变量,那么:
如果
a
是一个可变变量,它可能会在空检查后重新分配,并在block()
执行期间的某个时刻保持null
值;所有与并发相关的效果都起作用,如果
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 为空值或不同的值,并且观察给定实例的可变状态也应该正确同步。