gpt4 book ai didi

java - 死锁是按方法还是按类发生?

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

想象一下,我有一个带有多个同步方法的 First 类。当线程First锁定类时,它是按方法锁定还是按类锁定?例如下面的代码是否会发生死锁?

public class DeadLockQuestion {

public static class First{
public synchronized void a(){

}
public synchronized void b(){

}
public synchronized void c(){

}
public synchronized void d(){

}
public synchronized void e(){

}
}

public static void main(String... args){
First f = new First();

//This code is run in Thread 1
f.a();
// End
//This code is run in Thread 2 simultanously
f.b();
//End
// We have also Threads 3 & 4 & 5 that invoke c,d and e simultanously

}

}

最佳答案

您在 Java 中有两把锁。一是对象锁。另一个是类锁。对象锁仅锁定对同步非静态函数的访问。类锁仅锁定同步静态函数。对于您来说,它是对象 f 上的对象锁。因此所有同步的非静态函数都被对象f锁定。由于所有线程都使用相同的对象 f,因此只有一个线程能够访问您的非静态函数 a(), b(),... at一次。了解更多 here

does deadlock happen for the following code?

不,在你的情况下不会发生这种情况。因为当一个线程持有锁时,其他线程无法进入您的同步函数。由于资源而发生死锁。
您只有一个资源,即对象 f。这里没有必要出现死锁,因为 First 类不会锁定另一个对象,并且不会发生循环锁定。死锁需要循环锁!

一些信息:

  1. java中的同步保证没有两个线程可以执行同一个任务同步方法,同时需要相同的锁或同时。
  2. synchronized 关键字只能与方法和代码块一起使用。这些方法或 block 可以是静态的,也可以是非静态的。
  3. 当线程进入java同步方法或阻塞它时获取锁,并且每当它离开 java 同步方法或阻止它释放锁。即使线程离开,锁也会被释放同步方法完成后或由于任何错误或异常(exception)。
  4. 静态同步和非静态都有可能同步方法可以同时运行,因为他们锁定不同的对象。
    有用来源Here ,和here

关于java - 死锁是按方法还是按类发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20679373/

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