调用非同步方法时是否释放锁定

时间:2013-12-27 13:51:29

标签: java multithreading

如果我有一个同步的方法A

public synchronized void methodA() {
    // ... Some code
    methodB();
    // ... Some more code
}

我有一个不同步的methodB,并从methodA

调用
private void methodB() {
    // ...
}

线程将获取一个锁并进入methodA。我怀疑是当从methodA调用methodB时,当controll返回到methodA时,锁被释放并再次获取。

1 个答案:

答案 0 :(得分:7)

没有。执行此操作的唯一方法是Object.wait();

e.g。

public synchronized void methodA() {
    // ... Some code
    // releases the lock, waits 1000 ms or until notify()ed, & regains the lock.
    wait(1000); 
    // .. some code.
    methodB(); // doesn't do anything to the lock
    // ... Some more code
}

注意:因为DOESN' T释放锁定,您可能会发生多锁死锁。

class MyClass {
    public synchronized void methodA(MyClass mc) {
         mc.methodB();
    }

    public synchronized void methodB() {
         // something
    }
}

static MyClass MC1 = new MyClass(), MC2 = new MyClass();

如果您有一个调用

的线程
MC1.methodA(MC2);

和另一个叫

的人
MC2.methodA(MC1);
你可以陷入僵局。这是因为第一个方法锁定一个对象而第二个方法锁定另一个对象。由于线程以不同的顺序执行此操作,因此每个线程可以保持另一个需要的锁。