Причина тупика заключается в том, что поток A ожидает, пока поток B освободит некоторый ресурс, прежде чем A продолжит работу;то же самое для потока B, он не будет продолжаться, пока поток A не освободит некоторый ресурс.Другими словами, A и B ждут друг друга вечно.
Во фрагменте кода, synchronized может блокировать другие потоки на время, потому что только один поток может выполнить блок в данный момент.thread.sleep () приостанавливает поток на 500 миллисекунд, затем продолжает.Взаимное условие ожидания навсегда не удовлетворяет, поэтому оно не является тупиком.
Следующий фрагмент является хорошим примером для иллюстрации тупика
public class threadTest{
public class thread1 implements Runnable{
private Thread _th2;
private int _foo;
public thread1(Thread th2){};
public void run(){
for(int i = 0; i<100; i++){foo += foo;};
synchronized(this){this.notify()};
synchronized(_th2){
_th2.wait();
_foo += _th2.foo;
System.out.print(" final result " + _foo);
}
}
}
public class thread2 implements Runnable{
private final thread1 _th1; private int _foo;
public thread2(thread1 th1){};
public void Run(){
synchronized(_th1){_th1.wait()};
synchronized(this){
_foo += th1._foo();
this.notify();
}
}
}
}
}
// просто игнорируем способ доступа к закрытой переменной вкласс
Поскольку нет механизма, обеспечивающего порядок выполнения двух потоков, вполне возможно, что поток 2 не получит уведомление от потока 1, поскольку он запускается в последнее время, поэтому он ожидает уведомления, прежде чем продолжить выполнение.То же самое для thread1, он не может выполнять следующее выполнение, пока не получит уведомление от thread2.они оба ждут друг друга вечно, типичный тупик.