Java 避免在方法级别进行同步

Java 避免在方法级别进行同步,java,synchronized,pmd,Java,Synchronized,Pmd,PMD(源代码分析器)建议在方法级别避免synchronized。 实际上很明显,当您在方法上调用synchronized时,您在this上调用synchronized,这可能会导致潜在的问题 但此规则中的PMD建议以下示例: 公共类Foo{ //尽量避免这种情况: 同步void foo(){ } //喜欢这样:是的,技术上是一样的。这是关于代码风格,而不是正确性 您发布的链接很好地解释了原因: 添加新代码时,方法级同步可能会导致问题 块级同步有助于确保 需要同步的代码将获得它 SB_CONTR

PMD(源代码分析器)建议在方法级别避免
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) {
    }
  }
}