我有一個類靜態同步方法與非靜態同步方法
class Foo{
static synchronized get(){}
synchronized() getMore(){}
}
我有2個物體Foo.get()
和f.getMore()
在2個不同的線程T1和T2上運行。我有一個dobuts,當線程t1在類上鎖定時,線程t2可以訪問方法getMore,或者阻止t2獲取對方法的訪問和鎖定,因爲類對象被t1鎖定。
我有一個類靜態同步方法與非靜態同步方法
class Foo{
static synchronized get(){}
synchronized() getMore(){}
}
我有2個物體Foo.get()
和f.getMore()
在2個不同的線程T1和T2上運行。我有一個dobuts,當線程t1在類上鎖定時,線程t2可以訪問方法getMore,或者阻止t2獲取對方法的訪問和鎖定,因爲類對象被t1鎖定。
靜態方法將在Class
對象上進行同步,而不是實例對象。你有2個鎖在2個不同的物體上操作。在上面的場景中,不會有阻止行爲。
synchonized
鎖定一個對象並且static synchronized
鎖定代表該類的對象。
t1和t2可以同時調用這些方法,除非它們不能同時在static synchronized
方法中,除非除一個線程外都是wait()
ing。
注意:t1和t2可以同時爲不同的對象調用getMore()
。
靜態同步--->類級鎖定(類級範圍)
它類似於
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
}
}
synchonized static method
將獲得鎖java.lang.Class對象ct代表Foo類別。
synchonized instance method
將獲得Actual對象的鎖定。
[Java中的併發:同步靜態方法]的可能重複(http://stackoverflow.com/questions/5443297/concurrency-in-java-synchronized-static-methods) – bmargulies