死锁产生条件以及避免方式
死锁产生的四个条件:
- 资源互斥,同一时间内只有一个线程能访问这个共享资源
- 请求持有,此时一个线程已经持有了至少一个资源,并且又提出了新的资源请求,而新的资源已经被其他的请求占有,所以当前的线程已经被阻塞,并且阻塞以后不会释放当前已经持有的资源
- 不可剥夺条件,就是指线程获取到的资源在自己使用完成前,不会被其他线程抢占,只能自己使用完成后,由自己释放该资源
- 环路等待请求,指在发生死锁时,若干线程形成头尾相接的循环资源等待关系
解决方案:
- 互斥是没办法打破的,因为这就是我们使用锁的意义,就是为了互斥。
- 请求资源可以优化为一次请求所有的资源,避免互相等待。
- 打破不可剥夺条件,设置超时时间,已经持有资源的线程,如果长时间请求不到其他的资源,则释放当前持有的资源
- 环路加锁,注意加锁顺序,保证每个线程按照同样的顺序加锁