asynchronous - 如何在 Kotlin 中同步检查和设置变量?

标签 asynchronous kotlin

我有一个可变的可为空属性。我想检查一个方法的值是否为空,如果是,请将其设置为新创建的对象。然后我会调用属性的方法(旧的或新的,但现有的对象)。

这应该是线程安全的。我怎样才能在 Kotlin 中做到这一点?

.let ,我无法重新分配该属性。使用 synchronized(...) 时或 .withLock ,在赋值和调用之间,线程可以被另一个中断。或者至少 IDE 这么说,智能转换是不可能的。我不明白,为什么是synchronized如果它不同步块(synchronized block)呢?

var starterTask: AsyncTask<MyData, Void, Void>? = null

fun start() {
    make it thread safe {
        if (starterTask == null) {
            starterTask = a child of AsyncTask()
        }
        starterTask.execute(this) // <- no !! operator
    }
}

在 Java 中,如果我用 synchronized 锁定了一个对象,我可以检查、分配、调用一个对象,每个人都很高兴。我可以在 Kotlin 中做同样的事情吗?

最佳答案

您可以使用 delegated property为了那个原因:

val starterTask = lazy { a child of AsyncTask() }

fun start() {
    starterTask.execute(this)

默认线程安全模式是SYNCHRONIZED ,所以它符合您的需求。

关于asynchronous - 如何在 Kotlin 中同步检查和设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905102/

相关文章:

android - AWS S3文件上传与retrofit2视频/图像损坏

c# - 多次 Response.writeAsync 调用

ios - 多个文件下载任务的单个 ProgressView

Javascript,一个带有回调处理程序的对象,如何将其重写为await/async风格?

android - 如何在 Android 中保存和恢复 lambda?

Android:SupportMapFragment 顶部的 Snack bar 显示不正确

c++ - boost 异步TCP服务器写入错误

c# - 请求 - 使用异步 .Net 套接字库的响应模式

java - 不幸的是,MyApp已停止。我该如何解决?

kotlin - 当主线程退出时协程会发生什么?