2013-01-07 186 views
2

我有一個類靜態同步方法與非靜態同步方法

class Foo{ 

    static synchronized get(){} 
    synchronized() getMore(){} 
} 

我有2個物體Foo.get()f.getMore()在2個不同的線程T1和T2上運行。我有一個dobuts,當線程t1在類上鎖定時,線程t2可以訪問方法getMore,或者阻止t2獲取對方法的訪問和鎖定,因爲類對象被t1鎖定。

+0

[Java中的併發:同步靜態方法]的可能重複(http://stackoverflow.com/questions/5443297/concurrency-in-java-synchronized-static-methods) – bmargulies

回答

2

靜態方法將在Class對象上進行同步,而不是實例對象。你有2個鎖在2個不同的物體上操作。在上面的場景中,不會有阻止行爲。

0

synchonized鎖定一個對象並且static synchronized鎖定代表該類的對象。

t1和t2可以同時調用這些方法,除非它們不能同時在static synchronized方法中,除非除一個線程外都是wait() ing。

注意:t1和t2可以同時爲不同的對象調用getMore()

2

靜態同步--->類級鎖定(類級範圍)

它類似於

synchronized(SomeClass.class){ 
//some code 
} 

簡單同步--->實例級鎖定

實施例:

class Foo{ 

    public static synchronized void bar(){ 
     //Only one thread would be able to call this at a time 
    } 

    public synchronized void bazz(){ 
     //One thread at a time ----- If same instance of Foo 
     //Multiple threads at a time ---- If different instances of Foo class 
    } 

} 
0

synchonized static method將獲得鎖java.lang.Class對象ct代表Foo類別。

synchonized instance method將獲得Actual對象的鎖定。