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
语义,你需要明确地添加它 – 如你的例子。
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
完全一样,但在调用方更明确的是值是同步的。