所以我试图了解Kotlin如何处理属性的同步。如果我有这个课程:
intentChecked
我想确保& b使所有访问同步。我该怎么办?我尝试过使用注释:
class Foo {
var a = 0
var b = 0
}
但是Kotlin给了我一个编译器错误:
class Foo {
@Synchronized
var a = 0
@Synchronized
var b = 0
}
我只是想在Kotlin中更好地处理线程安全问题。这是我在Java中一直都是OCD的东西,我试图弄清楚如何在Kotlin中正确处理它。
答案 0 :(得分:18)
您无法在属性上进行同步,但可以在访问者方法上进行同步。使用以下语法:
class Foo {
var a = 0
@Synchronized get
@Synchronized set
//or
@get:Synchronized @set:Synchronized
var b = 0
}
答案 1 :(得分:3)
在@Kirill Rakhman的回答之后,如果对同一对象存在大量争用,则使用 Delegates 可能会更有效,因为它锁定了委托而不是整个对象。
class Foo {
var a by Synchronize(0)
var b by Synchronize(0)
}
class Synchronize<T>(defaultValue: T): ReadWriteProperty<Any, T> {
private var backingField = defaultValue
override fun getValue(thisRef: Any, property: KProperty<*>): T {
return synchronized(this) {
backingField
}
}
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
synchronized(this) {
backingField = value
}
}
}