gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:28:16 24 4
gpt4 key购买 nike

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

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

我有一个方法B,它没有同步并从方法A调用

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

线程将获取锁并进入methodA。我的疑问是,当从方法A调用方法B时,当控制返回到方法A时,锁会被释放并再次获取。

最佳答案

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

例如

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
}

注意:由于它不会释放锁,因此可能会出现多个锁的死锁。

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);

你可能会陷入僵局。这是因为第一个方法锁定一个对象,第二个调用锁定另一个对象。由于线程以不同的顺序执行此操作,因此每个线程都有可能持有另一个线程所需的锁。

关于java - 调用非同步方法时是否释放锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com