簡體   English   中英

避免在方法級別同步

[英]Avoid synchronized at method level

PMD(源代碼分析器)建議避免在方法級別synchronized 實際上很明顯,當您在方法上調用synchronized時,您正在為此調用同步, this可能會導致潛在的問題。

但此規則中的 PMD 建議使用以下示例:Synchronized on method rule

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) {
    }
  }
}

它是 PMD 規范中的錯誤(在示例中)還是同步方法與同步(this)的工作方式不同?

是的,它在技術上是相同的。 這是關於代碼風格,而不是正確性。

您發布的鏈接很好地解釋了原因:

將新代碼添加到方法時,方法級同步可能會導致問題。 塊級同步有助於確保只有需要同步的代碼才能獲得它。

SB_CONTRIB 中的一個附加規則不鼓勵在同步中使用它,因為 class object 也可以被其他線程用來鎖定。

http://fb-contrib.sourceforge.net/bugdescriptions.html

NOS_NON_OWNED_SYNCHRONIZATION 此方法使用同步塊,其中正在同步的 object 不歸當前實例所有。 這意味着其他實例可能會出於自己的目的使用相同的 object 進行同步,從而導致同步混亂。 僅在此 class 的私有字段上同步總是更清潔、更安全。 請注意,“this”不屬於當前實例,而是由將其分配給其 class 字段的任何人所有。 在“this”上同步也不是一個好主意。

結合這個 Spotbugs 規則,不同步整個方法體是一種很好的風格。

“正確”的版本至少是 PMD 文檔中的錯誤。

該規則的要點是表明將整個方法體放在同步塊中可能是不必要的; 大多數情況下,只有訪問多線程資源的代碼需要同步。 因此,這些示例應該顯示或暗示在同步塊之前和/或之后有一些代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM