java多线程之死锁

死锁在并发编程中是需要避免的,要修正死锁问题,必须明白死锁发生的条件:

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();
    }
}
原文地址:https://www.cnblogs.com/wangbin2188/p/9293992.html