2014-02-19 60 views
-2

一個類有一個同步的靜態方法和非靜態方法。兩個線程試圖訪問這些方法,他們能夠做到這一點嗎?有沒有鎖?什麼類型的鎖?靜態和非靜態方法的同步

+4

現在不清楚你在問什麼。它看起來像是Java?添加該標籤。還修復你的語法,然後最後添加你的代碼。 – AndyG

回答

1

當在方法上使用單詞​​時,您實際上鎖定了實例方法的this以及靜態方法的類本身。

例如:

public class MyClass { 
    public synchronized void foo1() {} 

    public synchronized void foo2() {} 
} 

在這個例子中,只有一個線程可以進入foo1()或同一個實例的foo2()。因此,如果我們有這樣的事情:

MyClass instance1 = new MyClass(); 
MyClass instance2 = new MyClass(); 

所以有可能一個線程在foo1()instance1,而另一個線程是在instance2foo1()。但2線程不可能進入的instance1foo2instance1。因爲它們都是使用this鎖定的。

靜態方法也是如此,但它們鎖定類本身。含義 - 一個線程可以在某個點輸入一個​​靜態方法。

+0

非常好的解釋..非常感謝。 – Jawa

+0

@ user3117979 - 如果可以接受答案會很好(標記問題旁邊的V號) – Avi

2

它們將被同步,但在不同的對象上,因此將不會對它們同時運行保護。

實例方法在對象實例上同步,而靜態方法在類對象上同步。

如果你想在兩者之間進行通用同步,請在同步子句中使用通用鎖對象。例如,你可以在類對象上同步。