简书链接:线程死锁
文章字数:273,阅读全文大约需要1分钟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| private static void deathLock() { new Thread(new Runnable() { @Override public void run() { synchronized (object) { System.out.println("线程1 拿了锁1"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程1准备拿锁2"); synchronized (object2) {//由于锁2 被线程2 拿了,线程2 又在等待锁1释放,去拿,所以你不让我我不让你,造成了死锁 System.out.println("线程1 拿了锁2"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("线程1 释放了锁2"); } System.out.println("线程1 释放锁1所完毕"); } }).start(); new Thread(new Runnable() { @Override public void run() { System.err.println("线程2准备拿锁2"); synchronized (object2) { try { System.err.println("线程2了拿锁2"); Thread.sleep(4000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.err.println("线程2准备拿锁1"); synchronized (object) { System.err.println("线程2拿了锁1"); } System.err.println("线程2释放了锁1"); } System.out.println("线程2释放锁2"); } }).start(); /* 死锁日志 线程1 拿了锁1 线程2准备拿锁2 线程2了拿锁2 线程1准备拿锁2 线程2准备拿锁1
解决方法,避免嵌套锁或者加标记判断是否持锁中。 */ }
|

我要拿你你要拿我,互不相让自己的锁,所以就出现了死锁