同步属性getter / setters

时间:2017-08-01 19:16:03

标签: java kotlin

所以我试图了解Kotlin如何处理属性的同步。如果我有这个课程:

intentChecked

我想确保& b使所有访问同步。我该怎么办?我尝试过使用注释:

class Foo {
    var a = 0
    var b = 0
}

但是Kotlin给了我一个编译器错误:

class Foo {
    @Synchronized
    var a = 0
    @Synchronized
    var b = 0
}

我只是想在Kotlin中更好地处理线程安全问题。这是我在Java中一直都是OCD的东西,我试图弄清楚如何在Kotlin中正确处理它。

2 个答案:

答案 0 :(得分:18)

您无法在属性上进行同步,但可以在访问者方法上进行同步。使用以下语法:

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

    //or

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

答案 1 :(得分:3)

在@Kirill Rakhman的回答之后,如果对同一对象存在大量争用,则使用 Delegates 可能会更有效,因为它锁定了委托而不是整个对象。

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 Delegated Properties Reddit Discussion