所以我试图了解Kotlin如何处理属性的同步.如果我有这个课程:
class Foo {
var a = 0
var b = 0
}
Run Code Online (Sandbox Code Playgroud)
我想确保a&b的所有访问权限都已同步.我该怎么办?我试过使用注释:
class Foo {
@Synchronized
var a = 0
@Synchronized
var b = 0
}
Run Code Online (Sandbox Code Playgroud)
但Kotlin给了我一个编译器错误:
class Foo {
var a = 0
var b = 0
}
Run Code Online (Sandbox Code Playgroud)
我只是想在Kotlin中更好地处理线程安全问题.这是我在Java中一直都是OCD的东西,而我正试图弄清楚如何在Kotlin中正确处理它.
Kir*_*man 24
您无法在属性上进行同步,但可以在访问器方法上进行同步.使用以下语法:
class Foo {
var a = 0
@Synchronized get
@Synchronized set
//or
@get:Synchronized @set:Synchronized
var b = 0
}
Run Code Online (Sandbox Code Playgroud)
小智 5
紧随其后的是@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
}
}
}
Run Code Online (Sandbox Code Playgroud)
参考资料: Kotlin 委托属性 Reddit 讨论
| 归档时间: |
|
| 查看次数: |
2889 次 |
| 最近记录: |