死锁:是指两个或两个以上的线程在执行过程中因争夺资源而造成的一种互相等待的现象,如果没有外力作用他们将无法推进下去
产生死锁的必要条件
互斥条件:所谓互斥就是进程在某一时间段内独占资源
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
不剥夺条件:进程已获得资源,在未使用完之前不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
活锁:任务或执行者没有被阻塞,由于某些条件没有被满足导致一直重复尝试,失败-尝试-失败
活锁和死锁的区别
处于活锁的实体是在不断的改变状态,所谓的“活”
处于死锁的实体表现为等待
活锁有可能自行解开,死锁不能
饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态
导致饥饿的原因
高优先级线程吞噬所有的低优先级线程的CPU时间
线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在他之前持续的对此同步块进行访问
线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续的获得唤醒