死锁及解决方案

泄露秘密 提交于 2020-04-14 08:59:10

【今日推荐】:为什么一到面试就懵逼!>>>

死锁:t1线程和t2线程各自占有共享资源o1,o2,互相在等待对方释放资源,这样形成的两个线程互相等待,无法继续运行的"死锁"状态.
解决方案:同一个代码块,不能持有两个对象锁.

package DeadLock;

public class DeadLockUse {
public static void main(String[] args) {
    Object o1 = new Object();
    Object o2 = new Object();
    Thread t1 = new MyThread1(o1,o2);
    Thread t2 = new MyThread2(o1,o2);
    t1.start();
    t2.start();
}
}
class MyThread1 extends Thread{
    Object o1;
    Object o2;
    public MyThread1(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run() {
        synchronized(o1) {
            try {
                Thread.sleep(1000*3);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            synchronized(o2) {
                    System.out.println("死锁解决了1!");
            }
        }
    }
}
class MyThread2 extends Thread{
    Object o1;
    Object o2;
    public MyThread2(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run() {
        synchronized(o2) {
            try {
                Thread.sleep(3*1000);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            synchronized(o1) {
                System.out.println("死锁解决了2!");
            }
        }
    }
}

解决方法:

package DeadLock;

public class DeadLockUse {
public static void main(String[] args) {
    Object o1 = new Object();
    Object o2 = new Object();
    Thread t1 = new MyThread1(o1,o2);
    Thread t2 = new MyThread2(o1,o2);
    t1.start();
    t2.start();
}
}
class MyThread1 extends Thread{
    Object o1;
    Object o2;
    public MyThread1(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run() {
        synchronized(o1) {
            try {
                Thread.sleep(1000*3);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        synchronized(o2) {
            System.out.println("死锁解决了1!");
    }
    }
}
class MyThread2 extends Thread{
    Object o1;
    Object o2;
    public MyThread2(Object o1, Object o2) {
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run() {
        synchronized(o2) {
            try {
                Thread.sleep(3*1000);
            } catch (InterruptedException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        synchronized(o1) {
            System.out.println("死锁解决了2!");
        }
    }
}

运行结果
死锁及解决方案

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!