2010-09-11 106 views
6

我不熟悉Java線程和同步。Java同步問題

可以說我有:

public class MyClass(){ 

    public synchronized void method1(){ 
     //call method2(); 
    } 

    public synchronized void method2(){}; 

} 
  1. 是什麼意思,當我同步一個實例對象的method1()?因此,當一個線程在嘗試訪問synchronized method1()時獲取了鎖,是否阻止其他線程訪問來自同一對象的另一個synchronized method2()

  2. 比方說,訪問方法1(當一個線程獲取鎖),但讓說method1()使得以method2()通話,這也是​​。這可能嗎?我的意思是有沒有任何規則可以阻止method1()呼叫method2()

在此先感謝。

回答

4
  1. See here

    ,不可能對同一對象上同步方法來交錯兩個調用。當一個線程正在執行一個對象的同步方法時,所有其他線程調用同一對象的同步方法塊(掛起執行),直到第一個線程完成對象。

  2. 因爲這個線程在當前對象的鎖,它可以調用method2(),並沒有其他線程。

7
  1. 是,使用在非靜態方法中的​​方法修飾符意味着它使用方法被調用的實例的顯示器,這是所有這些方法之間共享。
  2. 否 - 線程已經擁有顯示器,因此可以自由輸入由同一顯示器保護的其他塊。
2

問題2的說明,方法1()也可以調用同步方法也在其他這可能導致死鎖:

線程1調用同步方法1(),這反過來又需要調用同步method_b ()in OtherClass Thread2在AnotherClass上保存鎖,並且正在執行一個方法,該方法需要在其鎖定由Thread1保持的類中調用method1()方法

兩個線程都將阻塞等待另一個釋放鎖,僵局。

2

(1)這相當於:

public void method1(){ 
    synchronized (this) { 
     ... 
    } 
} 

因此,同步在當前實例。如果我們用相同的方法重寫method2 ...

public void method2(){ 
    synchronized (this) { 
     ... 
    } 
} 

...那麼您可以清楚地看到它們鎖定在同一個對象上,因此其他線程無法調用method1或method2,直到method1退出它的​​塊爲止。

(2)​​塊是可重入的,這意味着同一個線程可以輸入其他​​塊,可以根據需要多次鎖定相同的對象。據我瞭解,每次輸入​​塊時,Java都會將您正在同步的對象的計數器增加1,並且每次退出​​塊時,都會減少它。當該計數器達到0時,鎖定被釋放。