[英]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.