1. 程式人生 > >線程死鎖示例

線程死鎖示例

run out end exc cep per method read stat

線程死鎖:

 1 package com.iotek.synchronizedtest;
 2 
 3 public class DeadThread {
 4 
 5     /**
 6      * 線程死鎖示例
 7      * 相互等待鎖的釋放,導致死鎖,應避免同步塊裏面出現鎖的嵌套!!!
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         Example example = new Example();
12         DieThread1 thread1 = new
DieThread1(example); 13 thread1.start(); 14 DieThread2 thread2 = new DieThread2(example); 15 thread2.start(); 16 17 } 18 19 } 20 21 class DieThread1 extends Thread { 22 private Example example = null; 23 24 public DieThread1(Example example) { 25 super
(); 26 this.example = example; 27 } 28 29 @Override 30 public void run() { 31 example.method1(); 32 } 33 } 34 35 class DieThread2 extends Thread { 36 private Example example = null; 37 38 public DieThread2(Example example) { 39 super(); 40 this
.example = example; 41 } 42 43 @Override 44 public void run() { 45 example.method2(); 46 } 47 } 48 49 class Example { 50 private Object obj1 = new Object(); 51 private Object obj2 = new Object(); 52 53 public void method1() { 54 synchronized (obj1) { 55 // 同步代碼塊,獲取對象obj1的鎖 56 try { 57 Thread.sleep(1000); // 線程等待 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 } 61 synchronized (obj2) { 62 // 獲取對象obj1的鎖的同時,獲取obj2的鎖 63 System.out.println("method1"); 64 } 65 } 66 } 67 68 public void method2() { 69 synchronized (obj2) { 70 // 同步代碼塊,獲取對象obj2的鎖 71 try { 72 Thread.sleep(1000); // 線程等待 73 } catch (InterruptedException e) { 74 e.printStackTrace(); 75 } 76 synchronized (obj1) { 77 // 獲取對象obj2的鎖的同時,獲取obj1的鎖 78 System.out.println("method2"); 79 } 80 } 81 } 82 83 }

線程死鎖示例