2011-11-07 85 views
2

我對Java的併發性比較陌生(還沒有閱讀JCIP,但它在我的列表中!),並且我有一個關於鎖定行爲的問題。具體來說,Java是否鎖定對象的引用或對象本身?Java同步/鎖定

代碼示例(不是SSCCE,因爲我不知道如何來演示在實踐中,這種行爲):如果另一個線程執行method1()

static final Object lockA = new Object(); 

public void method1() { 
    synchronized(lockA) { 
     // do stuff here 
    } 
} 

public void method2() { 
    Object lockB = lockA; 
    synchronized(lockB) { 
     // do stuff 
    } 
} 

(因此對lockA鎖),將method2()被允許執行?

謝謝!

回答

6

同步在對象上完成,因此method2中的同步塊需要等待method1中的同步塊完成。

每個對象都有與之相關的「固有鎖定」(請參見Intrinsic Locks and Synchronization)。同步塊使用與您正在同步的對象關聯的內部鎖。

+0

太棒了,謝謝! – BenCole

3

不,method2()將因爲兩個方法在同一個對象上同步而被阻塞(lockB僅僅是指向與lockA相同的對象的引用)。