簡體   English   中英

Java中靜態和非靜態方法之間共享的資源

[英]Resource shared between static and non-static methods in java

我知道static synchronized方法鎖定在class對象上,而實例synchronized方法鎖定在Object的當前實例(即this

由於這兩個對象都不相同,因此它們具有不同的鎖,因此當一個線程執行static synchronized方法時,java中的其他線程不需要等待該線程返回,而是將獲得單獨的鎖。

考慮以下示例

public class Test {
  static int count = 0;

  public synchronized void f1(){
    count++;
  }

  public static synchronized void f2(){
    count++;
  }
}

在這里,共享計數不能以互斥的方式訪問,這可能會導致錯誤count傳遞給f1()調用者,而另一個線程正在使用static f2()方法遞增count

在這種情況下有什么解決方案? 我是在問正確的問題嗎? 並且,如果是真實情況,那么Java應當避免什么解決方案?

您可以對非靜態方法使用同步塊,並且它應使用與靜態同步方法相同的監視器:

public void f1() {
   synchronized(Test.class) {
     count++;
   }
}

經驗法則是,靜態同步方法應僅用於保護靜態變量,而非靜態同步方法應僅用於保護非靜態變量。

由於count是靜態的,因此從具有非靜態同步的塊中對其進行修改是不正確的。 要對此進行正確編碼並避免重復代碼,請從f1調用f2 ,如下所示:

public void f1(){
    ... // Do something ...
    f2();
    ... // Do something else ...
}

public static synchronized void f2(){
    count++;
}

暫無
暫無

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

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