将@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
注释吗?
答案 0 :(得分:2)
如果您希望实现@Synchronized
语义,则需要明确添加它 - 如您的示例所示。
object 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
的行为完全不同,但在调用者方面更明确的是值必须同步。