美文网首页
线程死锁及解决方案

线程死锁及解决方案

作者: 泽林呗 | 来源:发表于2019-03-15 17:11 被阅读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关键字,是共享资源,会造成死锁
    解决死锁的办法,只要破坏上面的其中一条就可以了

    相关文章

      网友评论

          本文标题:线程死锁及解决方案

          本文链接:https://www.haomeiwen.com/subject/qnjrmqtx.html