Exemplo de deadlock
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 }