我试图找出面试问题的答案 死锁涉及多少个线程
我回答它应该是两个或更多,但面试官说这是一个错误的答案。
我尝试在网上搜索,但无法理解为什么我的回答是错误的
答案 0 :(得分:1)
如果一个线程试图获取它已经拥有的资源,它就会自行死锁。想想一个持有数据库锁的线程,然后切换到另一个事务(不提交第一个事务)并尝试再次获得相同的锁。
答案 1 :(得分:1)
显而易见的答案是"两个或更多",因为你可能有一连串的依赖导致死锁。
1 locks A
2 locks B
3 locks C
3 requests A
2 requests C
1 requests B
他们可能意味着"一个或多个"如果你想检查被锁定资源不被拥有的情况"由线程,但由另一个资源。
如果资源的拥有对象不是线程,那么您需要多次出现拥有对象而不是线程导致死锁。在上面的例子中,1,2和& 3拥有资源而不是线程。
您可以考虑资源(A)还锁定资源(B)然后相同的线程请求资源(B)但无法获取资源的各种情况。但是,我真的不认为使用“死锁”这个词很有帮助。
答案 2 :(得分:0)
至少在Java中,线程看起来无法锁定自身(例如在递归中);但是另一个线程可以;因此答案必须是必须有两个线程;这是一个例子:
package threadLockTest;
public class ThreadLocking {
private Object LOCK = new Object();
public void recursionWithSynchronization (int count) {
System.out.println("inside recursionWithSynchronization: count: " + count);
synchronized (LOCK) {
if (count == 10) {
return;
} else {
try {
Thread.sleep(500);
recursionWithSynchronization((count+1));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public static void main (String... args) {
System.out.println("starting Main thread");
ThreadLocking stli = new ThreadLocking();
Runnable ry = () -> {
System.out.println("starting thread");
stli.recursionWithSynchronization(1);
System.out.println("ending thread");
};
Thread t1 = new Thread(ry);
Thread t2 = new Thread(ry);
t1.start();
t2.start();
System.out.println("ending Main thread");
}
}
答案 3 :(得分:0)
答案是,这取决于锁定或锁定机制的类型。
对于可重入锁,您需要两个或更多线程。 (请注意,Java基本锁/互斥锁是可重入的。)
对于非可重入锁,单个线程可以通过尝试获取已经拥有的锁 1 使其自身死锁。
线程也有可能以其他与死锁 2 完全不同的方式阻塞自身。例如:
Thread.currentThread().join();
将使线程等待完成,从而阻塞线程。在后台,join()
呼叫正在等待永远不会发生的通知/情况。您可以自己明确地做同样的事情。例如
Object lock = new Object(); // local variable
synchronized (lock) {
lock.wait();
}
1-这取决于锁的确切语义。例如,在这种情况下,可以实现非可重入锁 引发异常而不是死锁。
2-这是否实际上是一个死锁,取决于您对“死锁”一词所使用的精确定义。在面试中不宜就术语进行争论!