将@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
}
}
Run Code Online (Sandbox Code Playgroud)
当我从其他对象读取它们时,我想确保所有字段都被更新。我应该保留@Synchronized注释吗?
如果您希望实现@Synchronized语义,您需要显式添加它 - 正如您的示例所示。
object Singleton {}在这方面与使用eg 创建的对象没有什么不同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)
}
Run Code Online (Sandbox Code Playgroud)
并用于Singleton.state = Singleton.state.copy(field2 = 3)更新值。这显然与调用方的行为并不完全相同@Synchronized,但更明确地表明这些值是同步的。
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |