[英]synchronized static methods
如果我有一個包含許多同步方法的類,其中一些是靜態的,而其中一些不是:
public class A {
public static void synchronized f1() {}
public void synchronized f2() {}
}
當一個線程調用f1()和第二個調用f2()時會發生什么,這意味着它們如何彼此同步。 如果一個胎面調用f1()和f1()調用f2()會發生什么?
他們根本沒有彼此同步。 靜態方法在A.class
上同步,第二個在this
同步。 所以它(幾乎)好像你寫的:
public class A {
public static void f1() {
synchronized(A.class) {
...
}
}
public void f2() {
synchronized(this) {
...
}
}
}
如果一個胎面調用f1()和f1()調用f2()會發生什么
然后該線程將在f2
期間擁有兩個監視器。 在你這樣做之前你應該小心,就好像你在其他地方以相反的順序取出鎖,你將陷入僵局。
我個人會敦促你完全避免同步方法。 而是在僅用於鎖定的私有,最終字段上進行同步。 這意味着只有您的類能夠獲取相關的監視器,因此您可以更加仔細地了解鎖定時發生的情況,並避免死鎖等。
同步靜態方法在Class對象上而不是實例上同步。
f1()
和f2()
可以由兩個獨立的線程調用,並且可以同時執行。
請參閱: http : //java.sun.com/docs/books/jls/third_edition/html/classes.html#260369
同步靜態方法在類的相應Class對象上同步,因此它與實例方法使用的鎖不同。 顯然,靜態方法無法訪問this
。 因此,您的f1()和f2()方法不會相互同步,僅針對該類的其他靜態或其他實例方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.