Java 同步属性获取程序/设置程序
所以我试图弄清楚Kotlin是如何处理属性同步的。如果我有这门课:Java 同步属性获取程序/设置程序,java,kotlin,Java,Kotlin,所以我试图弄清楚Kotlin是如何处理属性同步的。如果我有这门课: class Foo { var a = 0 var b = 0 } 我想确保a&b的所有访问都是同步的。我该怎么做?我已尝试使用注释: class Foo { @Synchronized var a = 0 @Synchronized var b = 0 } 但是Kotlin给了我一个编译器错误: 此批注不适用于目标“具有支持字段的成员属性” 我只是想更好地处理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
}
}
}
class-Foo{
var a通过同步(0)
var b通过同步(0)
}
类同步(默认值:T):ReadWriteProperty
此语法是否一直在Kotlin中?如果没有,它引入了什么版本?我想它总是存在的。它是锁定在Foo
上还是锁定在创建的setter和getter函数上?@stk实例函数不是对象,所以不能锁定它们。因此,它必须锁定Foo
实例。为什么这不是sdk的一部分?它看起来很有用。。。这种方法有什么问题吗?我正在使用这种方法,到目前为止没有问题。也许以后会加上。希望如此。