死锁涉及多少个线程

时间:2015-07-14 07:28:32

标签: java multithreading

我试图找出面试问题的答案   死锁涉及多少个线程

我回答它应该是两个或更多,但面试官说这是一个错误的答案。

我尝试在网上搜索,但无法理解为什么我的回答是错误的

4 个答案:

答案 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-这是否实际上是一个死锁,取决于您对“死锁”一词所使用的精确定义。在面试中不宜就术语进行争论!