2011-11-07 87 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相同的对象的引用)。