为什么会造成死锁呢:
因为线程之间相互等待对方的资源,而造成永久阻塞的现象
四个条件:
互斥、占有且等待、不可抢占、循环等待。
我们只要打破其中一个条件,就可以解决死锁
1 互斥:一个共享的资源只能被一个线程占用
2 占有且等待:一个线程占有另一个线程需要的资源,并且还想去占有另一个线程的资源,但是另一个线程又是互斥的,不可抢占的,所以他只能一直等待,还一直占有另一个线程需要的资源
3 不可抢占: 资源只能当线程执行完自动释放,其他线程不能抢占
4 循环等待 : 线程1等待线程2的资源,线程2同时也等待1的资源
怎么解决死锁呢?
1互斥:
通过原子操作避免线程安全问题或者使用乐观锁,总之避免使用互斥锁
2占有且等待
把线程1需要的资源和线程1需要的但是被线程2占有的资源全部给线程1,线程1用完了释放资源,这样线程2就可以获取资源(将资源放在一起管理,然后线程1拿到资源后改变资源区状态,然后线程2自旋等待资源区状态改变)
3不可抢占
我们可以通过lock锁的超时机制,如果规定时间内线程1还没释放就强制释放资源给线程2
4循环等待
让他们有序等待,让线程2等待线程1用完资源1再用1,让线程2等待线程1用完资源2再去用2
但是这些操作都会破坏系统的性能,降低系统的吞吐量
埋坑:银行家算法可以有效避免死锁的产生,保障系统的效率,有空去看