线程死锁浅谈

来源:互联网 发布:知乎 法国亚马逊 编辑:程序博客网 时间:2024/06/10 21:10
死锁:当一个线程等待由另一个线程持有锁,而后者正在等待已被第一个线程持有的锁,就会发生死锁。
程序员为啥要关注这个死锁问题呢?
这就是因为神秘的JAVA虚拟机(JVM)不检测也不试图避免这种情况。 

 案例:
public class DeadLock {
    
    public void testDealLock() {
        MyThread mt = new MyThread();
        new Thread(mt).start();
        new Thread(mt).start();
    }
    
    //test
    public static void main(String[] args) {
        new DeadLock().testDealLock();
    }
    
    //内部类
    class MyThread implements Runnable{
        //资源
        private Object object1 = new Object();
        private Object object2 = new Object();
        private boolean flag = true;
        
        @Override
        public void run() {
            if (flag) {
                flag = false;
                synchronized (object1) {
                    System.out.println(Thread.currentThread().getName() + " object1");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (object2) {
                        System.out.println(Thread.currentThread().getName() + " object2");
                    }
                }
            } else {
                flag = true;
                synchronized (object2) {
                    System.out.println(Thread.currentThread().getName() + " object2--");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (object1) {
                        System.out.println(Thread.currentThread().getName() + " object1--");
                    }
                }
            }
        }
    }  
}

--结果
Thread-0 object1
Thread-1 object2--

原因是:
第一个线程获取object1的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第二个线程获取object2的锁后,进入休眠状态,放弃cup使用权但不是释放锁
第一个线程休眠结束,准备获取object2资源,发现object2资源被第二个线程锁住,那么就开始等待
第二个线程休眠结束,准备获取object1资源,发现object1资源被第一个线程锁住,也开始等待
        就这样,你等待我,我等待你,大家玩完,变成了死锁

0 0
原创粉丝点击