Java volatile修饰符和synchronized块
多个线程访问但仅在同步块内部的变量是否需要volatile修饰符? 如果没有,为什么?
您不需要在synchronized
使用volatile
,synchronized已经保证了在一致使用时(在每次访问时)变量的本地缓存的正确行为。
volatile
对原始值起作用,对于原始类型的primefaces访问可以是一个很好的快捷方式。 请注意,volatile的行为在JDK 5中已从1.4更改。
更多信息可以在这里找到
否。当您在同步块中工作时,所有缓存变量在访问时都会同步,因为它会创建内存屏障。
有关详细信息,请参阅volatile与synchronized的比较(有讨论)。
保证在同一对象(或方法)上同步的块不会同时运行。 因此,只要您同步到同一个对象 ,您的变量就永远不会有并发访问,因此不需要特殊处理。
如果您的访问不同步,那么您就有竞争条件。 使变量volatile
变得对于某些原始变量是正确的(我推迟到其他post以获得更好的volaitle信息)。 如果这没用,你几乎肯定有一个bug。