gpt4 book ai didi

java - 从另一个具有相同锁的同步块(synchronized block)调用同步块(synchronized block)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:19 25 4
gpt4 key购买 nike

我有这门课:

public class MyClass {

public MyClass(){}

public void actionA(){
synchronized(MyClass.class){
System.out.print("A");
}
}

public void actionB(){
synchronized(MyClass.class){
actionA();
}
}

}

哪一个(如果有的话)是真的?

  1. 调用 actionB() 将导致死锁,因为 actionA() 永远无法获取与 MyClass.class 关联的锁
  2. 调用 actionB() 不会导致死锁,因为它已经获得了与 MyClass.class 关联的锁

最佳答案

#2 会发生,因为调用线程有锁。

如果代码看起来像这样:

public void actionB(){
synchronized(MyClass.class) {
Thread thread = new Thread(new Runnable { run() { actionA(); }});
thread.start();
thread.join();
}
}

那么你就会陷入僵局。 是在每个线程的基础上获取的。

我发现一个有用的心理图片是一把挂锁的共享 key 。一次只有一个线程可以拥有 key ,但显然同一个 key 会打开它适合的任何锁( key 适合使用相同同步对象的任何锁)。

顺便说一句,在任何公开可见的字段上进行同步是不好的做法,因为远离的另一段代码可能锁定同一个对象,导致不必要的争用和可能的死锁。

关于java - 从另一个具有相同锁的同步块(synchronized block)调用同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652988/

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