setGameState()
和getGameState()
可以从不同的线程调用。 m_gameState
是易失性的,因此其价值/变化可能对其他线程可见。
问题:函数需要是synchronized
还是变量上的volatile是否足够?
private volatile EGameState m_gameState;
public void setGameState(EGameState a_gameState) {
m_gameState = a_gameState;
}
public EGameState getGameState() {
return m_gameState;
}
对volatile变量的访问就像它自身同步一样。
访问volatile变量永远不会持有锁,它不适合我们想要read-update-write作为原子操作的情况。这里你需要使用synchronized块。
对于其他情况,如果您不使用同步(如正常的get和set)就足够了
如果volatile
关键字与变量一起使用,则所有线程将从主存中获取变量的最新值。请注意,它不会获得锁定,因此如果您想进行任何原子操作,volatile
是不够的。对于原子操作,使用synchronized
。在你的情况下,你只读取值m_gameState = a_gameState;
,因此volatile是足够的。
希望能帮助到你。
那要看。您是否需要订购EGameState
字段的更新?
如果它们必须被订购,那么synchronized
区块(在this
上)是强制性的,如果没有,volatile
就足够了。
volatile
是内存中的自动加载/存储围栏;读写是原子的;您不需要在发布的示例中同步任何内容。