我对Java的并发性相对较新(仍然没有阅读JCIP,但它在我的列表中!)我有一个关于锁定行为的问题。具体来说,Java是锁定对象的引用还是对象本身?
代码示例(不是sscce,因为我不知道如何在实践中演示这种行为):
static final Object lockA = new Object();
public void method1() {
synchronized(lockA) {
// do stuff here
}
}
public void method2() {
Object lockB = lockA;
synchronized(lockB) {
// do stuff
}
}
如果另一个线程正在执行method1()
(因此锁定lockA
),是否允许method2()
执行?
谢谢!
答案 0 :(得分:6)
同步已在对象上完成,因此method2
中的同步块需要等待method1
中的同步块完成。
每个对象都有一个与其关联的“内在锁定”(参见Intrinsic Locks and Synchronization)。 synchronized块使用与您正在同步的对象关联的内部锁。
答案 1 :(得分:3)
不,method2()
将阻止,因为两个方法正在同一个对象上进行同步(lockB
仅仅是指向与lockA
相同的对象的引用。)