如何在 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。
我想从协同程序中同步访问代表我的状态的变量。我该如何解决这个问题?
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。