Exemplo de deadlock

De MediaWiki
Ir a la navegación Ir a la búsqueda

Tarefa

Comproba como a execución do seguinte código xenera unha situación de interbloqueo. Visibilízaa a través do IDE e de JConsole.

 1 package DeadLock2;
 2 
 3 //Un exemplo deadlock.
 4 class A {
 5   synchronized void foo(B b) {
 6     String name = Thread.currentThread().getName();
 7 
 8     System.out.println(name + " dentro A.foo");
 9 
10     try {
11       Thread.sleep(1000);
12     } catch(Exception e) {
13       System.out.println("A Interrupted");
14     }
15 
16     System.out.println(name + " Intentando chamar a B.last()");
17     b.last();
18   }
19 
20   synchronized void last() {
21     System.out.println("Dentro de A.last");
22   }
23 }
24 
25 class B {
26   synchronized void bar(A a) {
27     String name = Thread.currentThread().getName();
28     System.out.println(name + " dentro B.bar");
29 
30     try {
31       Thread.sleep(1000);
32     } catch(Exception e) {
33       System.out.println("B Interrupted");
34     }
35 
36     System.out.println(name + " Intentando chamar a a A.last()");
37     a.last();
38   }
39 
40   synchronized void last() {
41     System.out.println("Dentro de A.last");
42   }
43 }
44 
45 class Deadlock2 implements Runnable {
46   A a = new A();
47   B b = new B();
48 
49   Deadlock2() {
50     Thread.currentThread().setName("MainThread");
51     Thread t = new Thread(this, "RacingThread");
52     t.start();
53 
54     a.foo(b); // get lock on a in this thread.
55     System.out.println("Back in main thread");
56   }
57 
58   public void run() {
59     b.bar(a); // get lock on b in other thread.
60     System.out.println("Back in other thread");
61   }
62 
63   public static void main(String args[]) {
64     new Deadlock2();
65   }
66 }