Java 避免使用volatilefix

Java 避免使用volatilefix,java,concurrency,sonarqube,volatile,pmd,Java,Concurrency,Sonarqube,Volatile,Pmd,PMD规则集中定义的规则之一是:“避免使用Volatile”,这说明“不建议使用修饰语Volatile”。该规则在PMD的争议规则集中提到。 在我的团队中,我们在各个模块上配置了Sonar,这些模块间接地从PMD中设置了规则集,因此任何使用volatilepops作为严重警告的行为都是如此 问题是为什么要使用volatile? volatile关键字用于布尔变量以控制外部会话的状态。此状态可跨多个线程访问,因此要知道状态是向上还是向下,它将作为布尔易失性变量进行维护,以便在多个线程之间共享可见性

PMD规则集中定义的规则之一是:“避免使用Volatile”,这说明“不建议使用修饰语Volatile”。该规则在PMD的争议规则集中提到。
在我的团队中,我们在各个模块上配置了Sonar,这些模块间接地从PMD中设置了规则集,因此任何使用volatilepops作为严重警告的行为都是如此

问题是为什么要使用volatile?
volatile关键字用于布尔变量以控制外部会话的状态。此状态可跨多个线程访问,因此要知道状态是向上还是向下,它将作为布尔易失性变量进行维护,以便在多个线程之间共享可见性

我的问题是如何修复此声纳警告?
一种解决方案是从规则集中删除规则,这是不允许的,因为:首先,不建议这样做,因为这些规则构成了PMD规则集中定义的基本准则;其次,我所在组织中的SONAR服务器是所有团队使用的中央服务器。因此,这是不允许的

另一个解决方案是通过使用一些注释来忽略声纳警告,这在基本规则集上也是不推荐的

有人能建议我们如何用代码修复这个声纳警告吗


提前感谢。

首先,此规则并不表示代码中存在一般问题-
volatile
是一个非常好的关键字,没有任何问题。这就是为什么这是一个好消息

另一方面,使用它确实是一种先进的技术,需要你知道自己在做什么。在某些情况下,您会知道,比如说,维护您的代码的人没有足够的Java知识。在这种情况下,这条规则可能是有道理的


要满足您案例中的规则,请使用。

为什么不使用注释抑制警告

@SuppressWarnings("PMD.AvoidUsingVolatile")

有没有想过使用
AtomicBoolean
?当您需要跨越内存障碍时,阻止您使用volatile的工具是不值得的using@SleimanJneidi根据这句话,“人们不知道他们在做什么,所以他们不应该这样做”。这是一个不好的理由。我不同意文档中的陈述“使用关键字‘volatile’通常用于微调Java应用程序”。我从来没有因为这个原因使用过它。这条规则很荒谬——去掉警告,但保持代码正确。盲目应用这些“有争议”的规则是毫无意义的。其中有些甚至是冲突的(如不必要的构造函数和AtlestoneConstructor)。有些没有意义:为什么要在非并发代码中用ConcurrentHashMap替换HashMap的每个实例?等