死锁
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 —— 来自百度百科
死锁产生的原因:
(1) 不可剥夺资源以及临时资源的竞争
(2) 进程间的推进顺序问题:进程P1持有资源R1,进程P2持有资源R2,但是P1进程向R2资源推进,P2进程向R1资源推进,导致两边循环等待
死锁产生的必要条件:
(1) 相互排斥:进程对于自己持有的进程有排他性,不允许其他的进程持有该资源。
(2) 不可剥夺资源:当进程持有资源时,该资源只能由该进程自己释放。
(3) 请求和保留条件:当进程请求另外一个资源的时候,该进程保留自己已有的资源。
(4)线程和资源的循环链
死锁的预防:
(1)银行家算法:定义一个安全状态,定义一个关于进程的表格,表格
进程 | 该进程持有的资源数 | 该进程最多持有数 | 还需要多少进程 |
进程1 | 2 | 8 | 6 |
然后看当前进程是否能够满足所有进程,如果能够满足就是安全状态,如果满足不了就是非安全状态,cpu也就不会给这些进程分配空间。
(2) 进程在等待资源时,将所持有的资源释放,当该进程重新获得原有资源和请求资源时再重启。
死锁的预防(通过破坏死锁的必要条件来达到预防死锁的目的):
1.一次性将进程所需要的所有资源全部分配(破坏请求条件),如果进程有一个资源没有得到请求那么其他的所有资源都不给这个进程分配(破坏保持条件)。
2.如果进程请求其他资源时阻塞,释放持有的资源(破坏不可剥夺资源条件)
3.资源的有序编号,将稀有的,访问量大的资源设成大编号,只有持有小编号资源的进程才能请求大编号资源。
sync锁:当前进程持有锁请求其他资源时,如果请求阻塞就会永久等待下去。
lock接口中提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。