[英]synchronize property getters/setters
所以我试图了解 Kotlin 如何处理属性同步。 如果我有这门课:
class Foo {
var a = 0
var b = 0
}
我想确保 a & b 的所有访问都同步。 我该怎么做? 我试过使用注释:
class Foo {
@Synchronized
var a = 0
@Synchronized
var b = 0
}
但是 Kotlin 给了我一个编译器错误:
此注释不适用于目标“具有支持字段的成员属性”
我只是想更好地处理 Kotlin 中的线程安全问题。 这是我在 Java 中一直被强迫症所困扰的事情,我正试图弄清楚如何在 Kotlin 中正确处理它。
您不能在属性上同步,但可以在访问器方法上同步。 使用以下语法:
class Foo {
var a = 0
@Synchronized get
@Synchronized set
//or
@get:Synchronized @set:Synchronized
var b = 0
}
紧随其后的是@Kirill Rakhman 的回答,如果同一个对象存在大量争用,则使用委托可能会更高效,因为它锁定了委托而不是整个对象。
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
}
}
}
参考资料: Kotlin 委托属性Reddit 讨论
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.