同步属性获取器/setter

2022-09-02 02:57:37

因此,我试图了解 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中正确处理它。


答案 1

不能在属性上进行同步,但可以在访问器方法上进行同步。使用以下语法:

class Foo {
    var a = 0
        @Synchronized get
        @Synchronized set   

    //or

    @get:Synchronized @set:Synchronized
    var b = 0
}

答案 2

其次是@Kirill Rakhman的回答,如果对同一对象有大量的争用,那么使用Repreeses可能会更有效率,因为它锁定的是委托而不是整个对象。

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 讨论


推荐