线程3-线程死锁
1、死锁原因
(1)死锁问题处理线程同步时需要处理
(2)不同的线程分别占用对方需要的资源不放弃,都在等待对方先释放自己需要的同步资源,就造成了线程死锁
(3)当线程执行完代码后,或者执行过程中发生异常时,线程会释放对象锁
2、死锁例子
package com.thread.test; //死锁问题处理线程同步时需要处理 //不同的线程分别占用对方需要的资源不放弃,都在等待对方先释放自己需要的同步资源,就造成了线程死锁 class DeatThreadTest implements Runnable { StringBuffer sbr = new StringBuffer(); Object obj1 = new Object(); Object obj2 = new Object(); @Override public void run() { synchronized (obj1) { sbr.append("A"); Thread.currentThread(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sbr); synchronized (obj2) { sbr.append("B"); System.out.println(sbr); } } synchronized (obj2) { sbr.append("C"); Thread.currentThread(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sbr); synchronized (obj1) { sbr.append("D"); System.out.println(sbr); } } } } public class DeadThread { public static void main(String[] args) { DeatThreadTest dtt = new DeatThreadTest(); Thread t1 = new Thread(dtt); Thread t2 = new Thread(dtt); t1.start(); t2.start(); //当线程1启动后,先拿到obj1的锁 //在线程1沉睡时,这时线程2先拿到obj2的对象锁 //此时,线程1等待线程2释放obj2的对象锁,线程2等待线程1释放obj1的对象锁,导致死锁 } }