线程死锁及解决方案

2019-03-15  本文已影响0人  泽林呗

发生死锁的原因一般是两个对象的锁相互等待造成的。

学过操作系统的朋友都知道:产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

所以,简单来说,就是一个线程持有一个锁,另一个线程持有另一个锁。两个线程同时申请获取对方的锁,导致相互都阻塞在那里,谁也不愿意释放锁,导致死锁。

public class TryDieSock implements Runnable {
    private int flag = 1;
    static Object obj1 = new Object(), obj2 = new Object();
    @Override
    public void run() {
        if (flag == 1) {
            synchronized (obj1) {
                System.out.println("锁定了obj1,过0.5秒后去锁定obj2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("1");
                }
            }
        }
        if (flag == 0) {
            synchronized (obj2) {
                System.out.println("锁定了obj2,过0.5秒后去锁定obj1");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1) {
                    System.out.println(0);
                }
            }
        }
    }

    public static void main(String[] args) {
        TryDieSock try1 = new TryDieSock();
        TryDieSock try2 = new TryDieSock();
        try1.flag = 1;
        try2.flag = 0;
        Thread thread1 = new Thread(try1);
        Thread thread2 = new Thread(try2);
        thread1.start();
        thread2.start();
    }
}

因为object1和object2加上了static关键字,是共享资源,会造成死锁
解决死锁的办法,只要破坏上面的其中一条就可以了

上一篇下一篇

猜你喜欢

热点阅读