死锁是指一组互相竞争的线程因为互相等待导致“永久”阻塞的现象
发生死锁的原因
- 互斥条件:共享资源 x 和 y 只能被一个线程占用;
- 占有且等待:线程 t1 以及取得共享资源 x,在等待共享资源 y 的时候,不释放共享资源 x;
- 不可抢占:其他线程不能强行抢占线程 t1 占有的资源;
- 循环等待:线程t1等待线程t2占有的资源,线程t2等待线程t1占有的资源;
如何避免死锁
打破死锁发送的其中一个原因就可以:
第一个互斥条件不可以被打破,因为锁本身就是通过互斥来解决线程安全问题的;
打破占有且等待:我们可以一次性去获取所有需要的资源,这样就不存在等待了;
不可抢占:如果一个线程在拥有资源的情况下并去申请其他资源的时候,如果申请不到,就主动去释放当前所占有的资源;
循环等待:可以按照顺序申请资源来预防;指的是资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的。