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;
}
答案 0 :(得分:2)
对volatile变量的访问就好像它本身是同步的。
访问易失性变量永远不会持有锁,这不适用于我们希望以原子操作方式进行读取-更新-写入的情况。在这里,您需要使用同步块。
在其他情况下,如果您不使用同步(例如正常的get和set)就足够了
答案 1 :(得分:2)
如果将volatile
关键字与变量一起使用,则所有线程将从主内存中获取变量的最新值。请注意,它不会获得锁定,因此如果您要执行任何原子操作,volatile
是不够的。对于原子操作,使用synchronized
。在您的情况下,您只读取值m_gameState = a_gameState;
,所以volatile就足够了。
希望有帮助。
答案 2 :(得分:1)
这取决于。您是否要求对EGameState
字段的更新进行排序?
如果必须订购它们,那么synchronized
上的this
块是强制性的,否则,volatile
就足够了。
答案 3 :(得分:1)
volatile
是内存中的自动加载/存储栅栏;读写是原子的;您无需在发布的示例中进行任何同步。