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

问题描述 投票:0回答:1

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

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 如果不可能的话,有什么其他优雅的解决方案吗?

kotlin getter-setter kotlin-coroutines
1个回答
0
投票

要在非暂停的上下文中调用暂停函数。你可以使用 runBlocking.

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

注意事项。

你可能最好将属性改为两个暂停函数(gettersetter),而不是使用 runBlocking.所有这些都取决于你在什么情况下调用 myState.

你也可以考虑投票给 KT-15555.

© www.soinside.com 2019 - 2024. All rights reserved.