Java 避免在方法级别进行同步
PMD(源代码分析器)建议在方法级别避免Java 避免在方法级别进行同步,java,synchronized,pmd,Java,Synchronized,Pmd,PMD(源代码分析器)建议在方法级别避免synchronized。 实际上很明显,当您在方法上调用synchronized时,您在this上调用synchronized,这可能会导致潜在的问题 但此规则中的PMD建议以下示例: 公共类Foo{ //尽量避免这种情况: 同步void foo(){ } //喜欢这样:是的,技术上是一样的。这是关于代码风格,而不是正确性 您发布的链接很好地解释了原因: 添加新代码时,方法级同步可能会导致问题 块级同步有助于确保 需要同步的代码将获得它 SB_CONTR
synchronized
。
实际上很明显,当您在方法上调用synchronized
时,您在this
上调用synchronized,这可能会导致潜在的问题
但此规则中的PMD建议以下示例:
公共类Foo{
//尽量避免这种情况:
同步void foo(){
}
//喜欢这样:是的,技术上是一样的。这是关于代码风格,而不是正确性
您发布的链接很好地解释了原因:
添加新代码时,方法级同步可能会导致问题
块级同步有助于确保
需要同步的代码将获得它
SB_CONTRIB中的另一条规则不鼓励在synchronized中使用该类,因为其他线程也可以使用该类对象来锁定
NOS_非_所有_同步
此方法使用同步块,其中正在同步的对象不属于此当前实例。这意味着其他实例可能出于自身目的使用此同一对象进行同步,从而导致同步混乱。仅在此类的专用字段上进行同步始终更干净、更安全。注意“this”不属于当前实例,而是属于任何将其分配给其类的字段的人。在“this”上同步也不是一个好主意
与此Spotbugs规则相结合,不同步整个方法体不仅仅是一种好的方式。至少在PMD文档中,“正确”的版本是错误
规则的要点是指出,将整个方法体放在同步块中可能是不必要的;在大多数情况下,只有访问多线程资源的代码需要同步。因此,示例应该显示或暗示,在同步块之前和/或之后有一些代码。正确的版本至少在PMD文档中是错误的。规则的要点是指出将整个方法体放在同步块中可能是不必要的。因此示例应该显示或暗示在同步块之前和/或之后有一些代码。@VGR这应该是我问题的答案。谢谢你,似乎是正确的。但无论如何,在PMD中添加这样的“好例子”是非常令人困惑的。
public class Foo {
// Try to avoid this:
synchronized void foo() {
}
// Prefer this: <----- Why? Isn't it the same on byte-code level
void bar() {
synchronized(this) {
}
}
}