同步属性getter/setters

use*_*059 12 java kotlin

所以我试图了解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 讨论