想象一下,我有一个带有多个同步方法的 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 类不会锁定另一个对象,并且不会发生循环锁定。死锁需要循环锁!
一些信息:
关于java - 死锁是按方法还是按类发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20679373/