android – Kotlin对象/单例的方法是否同步?

将@Synchronized注释添加到对象的方法以使它们成为原子或不需要它是否有意义?

例如:

object Singleton {

    var field1: Int = 0
        private set

    var field2: Int = 0
        private set

    @Synchronized fun updateFields(f1: Int, f2: Int) {
        field1 = f1
        field2 = f2
    }

}

我想确保从其他对象读取所有字段时更新所有字段.我应该保留@Synchronized注释吗?

最佳答案 如果您希望实现
@Synchronized语义,则需要明确添加它 – 如您的示例所示.

对象Singleton {}在这个问题上与用例如对象创建的对象没有区别. val obj = Singleton().

确保字段同步的另一种方法是明确地对其进行建模,例如:

object Singleton {
    @Volatile var state = State(0, 0)

    val field1: Int get() = state.field1
    val field2: Int get() = state.field2

    data class State(val field1: Int, val field2: Int)
}

并使用Singleton.state = Singleton.state.copy(field2 = 3)更新值.这显然与@Synchronized的行为完全不同,但在调用者方面更明确的是值必须同步.

点赞