如何在 kotlin 中编写包含 mutex.withLock 的 getter 和 setter

how to write getter and setter containing mutex.withLock in kotlin

我想从协同程序中同步访问代表我的状态的变量。我该如何解决这个问题?

private var myState: MyState? = null
    get() = mutex.withLock {
        return@withLock myState
    }
    set(value) = mutex.withLock {
        field = value
    }
private val mutex = Mutex()    

现在我收到 Suspend function 'withLock' should be called only from a coroutine or another suspend function 消息。 如果不可能,还有其他优雅的解决方案吗?

在非挂起上下文中调用挂起函数。您可以使用 runBlocking.

private var myState: MyState? = null
    get() {
        return runBlocking {
            mutex.withLock {
                myState
            }
        }
    }
    set(value) {
        runBlocking {
            mutex.withLock {
                field = value
            }
        }
    }
private val mutex = Mutex()    

备注:

您最好将 属性 更改为两个暂停函数 (getter/setter),而不是使用 runBlocking。 一切都取决于您调用 myState.

的上下文

您还想考虑投票给 KT-15555