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

问题描述 投票:5回答:4

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;
}
java volatile
4个回答
2
投票

对volatile变量的访问就像它自身同步一样。

访问volatile变量永远不会持有锁,它不适合我们想要read-update-write作为原子操作的情况。这里你需要使用synchronized块。

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


2
投票

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

希望能帮助到你。


1
投票

那要看。您是否需要订购EGameState字段的更新? 如果它们必须被订购,那么synchronized区块(在this上)是强制性的,如果没有,volatile就足够了。


© www.soinside.com 2019 - 2024. All rights reserved.