繁体   English   中英

同步属性 getter/setter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM