死锁在并发编程中是需要避免的,要修正死锁问题,必须明白死锁发生的条件:
1.互斥条件:
任务中使用的资源至少有一个是不能共享的
2.请求与保持条件:
一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:
进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:
若干进程之间形成一种头尾相接的循环等待资源关系。
下面我们着手实现一个死锁:
public class DeadThread implements Runnable { public String username; public Object lock1=new Object(); public Object lock2=new Object(); public void setFlag(String username){ this.username=username; } @Override public void run() { if(username.equals("a")){ synchronized (lock1){ try { System.out.println("username="+username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2){ System.out.println("按lock1->lock2顺序执行了"); } } } if(username.equals("b")){ synchronized (lock2){ try { System.out.println("username="+username); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1){ System.out.println("按lock2->lock1顺序执行了"); } } } } } public class Run { public static void main(String[] args) { DeadThread d1=new DeadThread(); d1.setFlag("a"); Thread t1=new Thread(d1); t1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } d1.setFlag("b"); Thread t2 = new Thread(d1); t2.start(); } }