是科特林吗?.let
线程安全?
比方说a
变量可以在不同的线程中更改。
正在使用a?.let { /* */ }
线程安全?如果它等于if (a != null) { block() }
会不会发生在if
它不为空并且在block
它已经为空了吗?
a?.let { block() }
确实相当于if (a != null) block()
.
这也意味着如果a
是一个可变变量,那么:
-
If a
是一个可变变量,它可能会在空检查后重新分配并保存null
期间某个时刻的值block()
执行;
-
所有与并发相关的效果都有效,并且在以下情况下需要适当的同步:a
在线程之间共享以避免竞争条件,如果block()
访问a
again;
然而,作为let { ... }
实际上将其接收者作为单个参数传递给它所采用的函数,它可用于捕获a
并在 lambda 中使用它,而不是在 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 或不同的值,并且观察给定实例的可变状态也应该正确同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)