У меня есть простой код, как показано ниже, чтобы проверить тупиковая ситуацияКак срабатывает тупик в приведенном ниже коде?
public class ClassB {
public synchronized void fooB(Classs A) throws InterruptedException{
System.out.print("Thread : " + Thread.currentThread().getName()+ " entered to fooB \n");
Thread.sleep(1000);
System.out.print("ClassB locked the fooA \n");
A.lastA();
}
public synchronized void lastB(){
System.out.print("I am lastB \n");
}
}
И Кроме того, я еще один класс называется ClassA:
public class ClassA {
public synchronized void fooA(ClassB B) throws InterruptedException{
System.out.print("Thread : " + Thread.currentThread().getName()+ " entered to fooA \n");
Thread.sleep(1000);
System.out.print("ClassA locked the fooB \n");
B.lastB();
}
public synchronized void lastA(){
System.out.print("I am lastA \n");
}
}
Итак, теперь у меня есть еще один код, который вызывает эти классы и вызывает тупиковой, как показано ниже:
public class DeadLockTest implements Runnable {
ClassA ca=new ClassA();
ClassB cb=new ClassB();
public DeadLockTest() throws InterruptedException{
new Thread(this).start();
ca.fooA(cb);
}
public void run() {
try {
cb.fooB(ca);
} catch (InterruptedException ex) { ....
}
}
}
Как вы можете видеть первые резьбовые замки fooB с помощью ca.fooA (Cb), а вторая нить блокирует fooA, используя cb.fooB (ca) и Никто не блокирует методы lastA и lastB. Это означает, что эти методы должны быть доступны, но они недоступны. Зачем? Нити только блокируют fooA и fooB. Итак, почему, например, первый поток не может использовать lastB(), а второй не имеет доступа к lastA(), в то время как блокировка этих двух методов отсутствует?
Действительно, это скорее намерение, что все синхронизированные методы данного класса являются исключительными для данного объекта. Это победит цель, если один поток может быть «внутри» модифицирующего метода, тогда как другой поток находится внутри некоторого метода только для чтения. Я согласен с dcsohl. Вы не получили его, пока не получите это. Это «большая идея» в основе разработки параллельных программ с использованием взаимных исключений (mutex). – Persixty