Java同步/锁定

时间:2011-11-07 16:03:34

标签: java concurrency locking

我对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()执行?

谢谢!

2 个答案:

答案 0 :(得分:6)

同步已在对象上完成,因此method2中的同步块需要等待method1中的同步块完成。

每个对象都有一个与其关联的“内在锁定”(参见Intrinsic Locks and Synchronization)。 synchronized块使用与您正在同步的对象关联的内部锁。

答案 1 :(得分:3)

不,method2()将阻止,因为两个方法正在同一个对象上进行同步(lockB仅仅是指向与lockA相同的对象的引用。)

相关问题