簡體   English   中英

同步靜態方法

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

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