返回易失变量的函数是否需要同步?

时间:2019-02-23 18:17:10

标签: java volatile

可以从不同的线程调用

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;
}

4 个答案:

答案 0 :(得分:2)

对volatile变量的访问就好像它本身是同步的。

访问易失性变量永远不会持有锁,这不适用于我们希望以原子操作方式进行读取-更新-写入的情况。在这里,您需要使用同步块。

在其他情况下,如果您不使用同步(例如正常的get和set)就足够了

答案 1 :(得分:2)

如果将volatile关键字与变量一起使用,则所有线程将从主内存中获取变量的最新值。请注意,它不会获得锁定,因此如果您要执行任何原子操作,volatile是不够的。对于原子操作,使用synchronized。在您的情况下,您只读取值m_gameState = a_gameState;,所以volatile就足够了。

希望有帮助。

答案 2 :(得分:1)

这取决于。您是否要求对EGameState字段的更新进行排序
如果必须订购它们,那么synchronized上的this块是强制性的,否则,volatile就足够了。

答案 3 :(得分:1)