2014-02-16 48 views
19

我在腦海中有一個問題,我讀了類對象鎖定的靜態同步方法 和對象的當前實例上的同步方法鎖定。那麼對類對象鎖定 的含義是什麼?在java中使用靜態同步方法有什麼用途?

任何人都可以請幫我關於這個話題?

+0

任何「同步」的方法或塊上的條目,使得僅一次一個線程可以執行該方法/塊(相對於鎖定對象)「鎖定」。此外,一次只能有一個線程執行*鎖定在同一個對象上的任何*方法/塊。一個靜態同步方法被鎖定在Class對象上。 –

+0

@Zavior我不認爲它是重複的 - 你所關聯的問題是關於「它是如何完成的」,而這個問題是關於「爲什麼這樣做」。 – dasblinkenlight

+1

@dasblinkenlight我認爲你是對的 – Zavior

回答

41

通常,​​方法用於保護對同時訪問的資源的訪問。當同時訪問的資源屬於您的類的每個實例時,您使用​​實例方法;當資源屬於所有實例時(即,當它位於static變量中)時,則使用synchronized static方法來訪問它。

例如,您可以製作一個工廠方法,該工廠方法可以保存其生成的所有對象的「註冊表」。這種註冊的自然地點將是一個static集合。如果您的工廠在多個線程中使用,則需要使工廠方法​​(或在方法內部具有​​塊)來保護對共享static集合的訪問。

請注意,使用​​而沒有特定的鎖對象時,通常不是最安全的選擇,因爲當您構建要在其他人編寫的代碼中使用的庫時。這是因爲惡意代碼可能會在您的對象或類上同步以阻止自己的方法執行。爲了保護你的代碼不受這個影響,創建一個私有的「鎖定」對象,實例或靜態對象,並在該對象上進行同步。

+0

謝謝,@dasblinkenlight爲這樣的用戶回答,尤其是在您的圖書館中使用私人鎖定對象的指導。 –

18

簡而言之,static synchronized方法將鎖定類而不是對象,並且它將鎖定類,因爲關鍵字static表示:「class instead of instance」。

關鍵字​​表示一次只有一個線程可以訪問該方法。
static synchronized意味着:

只有一個可以同時訪問類。

+0

另請參閱更多詳細信息 - http://www.javatpoint.com/static-synchronization-example – amar

+0

最好的只有4行:) – roottraveller

31

在運行時,每個類都有一個Class對象的實例。這是由static synchronized方法鎖定的對象。 (任何同步的方法或塊必須鎖定一些對象。)

如果需要(無論是否在靜態方法中),還可以手動同步此對象。這兩種方法的行爲相同:

class Foo { 
    static synchronized void methodA() { 
     // ... 
    } 

    static void methodB() { 
     synchronized (Foo.class) { 
      // ... 
     } 
    } 
} 
+1

Hats off ...這個話題不是很清楚util我看過你的答案。即使是java doc也沒有像你那樣看起來像..... –

相關問題