如果我有一个同步的方法A
public synchronized void methodA() {
// ... Some code
methodB();
// ... Some more code
}
我有一个不同步的methodB,并从methodA
调用private void methodB() {
// ...
}
线程将获取一个锁并进入methodA。我怀疑是当从methodA调用methodB时,当controll返回到methodA时,锁被释放并再次获取。
答案 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);
你可以陷入僵局。这是因为第一个方法锁定一个对象而第二个方法锁定另一个对象。由于线程以不同的顺序执行此操作,因此每个线程可以保持另一个需要的锁。