一、死锁
两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
死锁的几种类型:
1.锁顺序死锁
原因:两个线程试图以不同的顺序来获得相同的锁;
如果所有线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁
2. 协作的对象间相互调用发生的死锁
3. 资源型死锁
1.死锁产生条件
- 互斥条件:该资源任意一个时刻只由一个线程占用。
- 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
- 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
2. 死锁的避免和预防
- 破坏请求与保持条件 :一次性申请所有的资源。
- 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
- 破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
二、饥饿
是指线程由于无法访问到它所需要的资源而不能继续执行。
常见原因:
1. cpu时钟周期
2. 使用了Thread 接口中定义的优先级。
要避免使用线程优先级,因为这会增加平台依赖性,并可能导致活跃性问题
三、活锁
是指线程既不阻塞、也不继续执行、不断地重复执行相同操作。
例如:线程处理事务,事务失败,消息处理机制回滚整个事务,并重新开始执行。
当多个相互协作的线程都对彼此进行相应从而修改各自的状态,并使得任何一个线程都无法继续执行时,就发生了活锁。
解决办法:引入随机性。