【发布时间】:2021-09-20 16:00:13
【问题描述】:
我对我的代码中的某些情况有点困惑。
private var state by synchronized<PlayerState>(Stopped())
val asStarted get() = state as? Started
val asStopped get() = state as? Stopped
inner class Stopped : PlayerState {
fun start(bpm: BPM = BPM(), volume: Int? = null) {
state = Started(bpm, volume)
}
}
假设两个线程正在尝试执行player.asStopped?.start(),我这里有问题吗?我需要输入这样的内容吗?
inner class Stopped : PlayerState {
@Synchronized
fun start(bpm: BPM = BPM(), volume: Int? = null) {
if(state is Started) return
state = Started(bpm, volume)
}
}
感谢您的帮助。
【问题讨论】:
-
多线程代码即使是聪明人也很难做到正确。我认为没有所有自定义锁定的事件线程和协程将是一个更安全的想法。
-
@duffymo 我不知道你对热协程的实现有什么了解,但对我来说它似乎是相当高级的库。我正在编写性能关键的 midi 音序器应用程序,这些应用程序必须在最大限度地使用 android 的 cpu 时非常顺利地运行,在我看来,这部分代码中的任何高级抽象都是毫无疑问的。
标签: java multithreading kotlin thread-safety