死锁

来源:互联网 发布:手机进入网络管理网址 编辑:程序博客网 时间:2024/06/03 18:48

锁顺序死锁

当两个线程试图以两种方式来获取相同的锁

thread-1:synchronized (lock1){    synchronized (lock2){        // ...    }}thread-2:synchronized (lock2){    synchronized (lock1){        // ...    }}

动态的锁顺序的死锁

函数参数不同,获取锁的顺序也不同
可通过方法内比较参数决定执行顺序解决死锁

    private void fun(Object lock1, Object lock2) {        synchronized (lock1){            synchronized (lock2){                // ...            }        }    }

相互协作对象操作死锁

    class A{        B b;        public synchronized void fun1(){};        /**         * 先获取A对象的锁,再获取B对象的锁         */        public synchronized void fun2(){            b.fun2();        };    }    class B{        A a;        /**         * 先获取B对象的锁,再获取A对象的锁         */        public synchronized void fun1(){            a.fun1();        };        public synchronized void fun2(){};    }

解决方法:公开调用,使用拷贝对象或者缩小持有锁的范围,避免死锁的产生,弊端是破坏了操作的原子性

        /**         * 先获取A对象的锁,再获取B对象的锁         */        public void fun2(){            synchronized (this){                // .. clone                c=b;            }            c.fun2();        };

资源死锁

争抢资源而得不到满足,产生死锁。

定时锁解决死锁

采用显式重入锁代替内置锁,可设置超时处理

0 0