首页 > 解决方案 > Kotlin `?.let` 是线程安全的吗?

问题描述

Kotlin?.let线程安全吗?

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

标签: multithreadingkotlinletthread-synchronization

解决方案


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

这也意味着 ifa是一个可变变量,那么:

  1. a可能在空检查后重新分配,并在执行null时保持一个值block()

  2. 所有与并发相关的效果都有效,如果在线程之间共享,则需要适当的同步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 或不同的值,并且观察给定实例的可变状态也应该正确同步。


推荐阅读