2017-08-09 81 views
1

我對於synhronization(靜態和非靜態方法)的行爲有點困惑。關於靜態和非靜態方法的Java同步

例如:

1.

class MyClass { 
    ... 
    public synchronized static someMethod() { 
    ... 
    } 
    public static someMethod2() { 
    ... 
    } 

    ... 
} 

因此,如果線程A呼叫someMethod1(),併線程B對someMethod2鎖()?

2.

 class MyClass { 
    ... 
    public synchronized someMethod() { 
    ... 
    } 
    public someMethod2() { 
    ... 
    } 

    ... 
} 

如果我們有一個MyClass的=新MyClass的(),線程A調用方法的someMethod(),併線對someMethod2鎖()?

回答

1

兩者的答案都是否定的。同步是一種合作機制。在實例或類上同步不會阻止其他線程調用另一個方法,除非該方法也在同一監視器上同步。

0

在您的兩個問題的答案是No:線程B將無法在方法someMethod2因爲這種方法不同步鎖定。 只有當兩個線程都會調用someMethod時,同步和相關鎖定纔會起作用。

在這種情況下唯一的區別是將被鎖定的目標。同步方法使用方法接收器作爲鎖(即對非靜態方法使用this,對靜態方法使用封閉類)

+0

同步不會阻止調用未同步的方法。 – shmosel

+0

謝謝,修改了答案。我沒有正確理解這個問題 –

0

不,另一種方法可以在這些情況下自由鎖定。當另一個線程鎖定類的非靜態方法時,線程可以獲取靜態方法的鎖。這些方法有不同的監視器。

當一個靜態方法被同步時,它在一個類上同步。這意味着執行靜態方法時,整個類都被阻塞。所以其他靜態同步方法也被阻塞。在其他情況下,當一個非靜態方法被同步時,它將在一個實例上同步。只有這個特定對象的所有同步方法都被阻塞。

+0

但另一種方法不同步。 – shmosel