由多个线程访问但仅在同步块内的变量是否需要 volatile 修饰符?如果不是,为什么?
问问题
5697 次
3 回答
14
您不需要使用volatile
inside synchronized
, synchronized 已经保证了在一致使用时(在每次访问时)本地缓存变量的正确行为。
volatile
适用于原始值,并且可以成为对原始类型进行原子访问的一个很好的快捷方式。请注意, volatile 的行为在 JDK 5 中从 1.4 发生了变化。
更多信息可以在这里找到
于 2010-07-09T17:13:20.920 回答
4
不会。当您在同步块中工作时,所有缓存的变量都会在访问时同步,因为它会创建内存屏障。
有关详细信息,请参阅volatile 与 synchronized的比较(带讨论)。
于 2010-07-09T17:12:54.467 回答
2
保证在同一对象(或方法)上同步的块不会同时运行。所以只要你同步到同一个对象,你的变量永远不会有并发访问,所以不需要特殊处理。
如果您的访问不同步,那么您就有竞争条件。对于某些原始变量,使该变量volatile
可能是正确的(我会参考其他帖子以获得有关 volaitle 的更好信息)。如果这没有用,那么您几乎肯定有一个错误。
于 2010-07-09T17:18:58.520 回答