Java volatile修饰符和synchronized块

时间:2010-07-09 17:09:16

标签: java multithreading synchronized volatile

多个线程访问但仅在同步块内访问的变量是否需要volatile修饰符?如果没有,为什么?

3 个答案:

答案 0 :(得分:11)

您不需要在volatile内使用synchronized,synchronized已经保证了在一致使用时(每次访问时)本地缓存变量的正确行为。

volatile适用于原始值,对于原始类型的原子访问可以是一个很好的快捷方式。请注意,volatile的行为在JDK 5中已从1.4更改。

可以找到更多信息here

答案 1 :(得分:4)

没有。当您在同步块中工作时,所有缓存的变量在访问时都会同步,因为它会创建内存屏障。

有关详情,请参阅volatile to synchronized的比较(有讨论)。

答案 2 :(得分:2)

保证在同一对象(或方法)上同步的块不会同时运行。所以只要您同步到同一个对象,您的变量就永远不会有并发访问,所以它不需要特殊处理。

如果您的访问未同步,那么您就有竞争条件。使变量volatile对于某些原始变量可能是正确的(我推迟到其他帖子以获得有关volaitle的更好信息)。如果这没用,你几乎肯定有一个错误。