java开发:java多线程(九):死锁

简介:

死锁是指多线程在相互竞争资源时陷入僵局,导致线程无法往下执行。例如线程1持有A资源,运行过程中去请求B资源,同时线程2持有B资源,此时也正在请求A资源,俩个线程互相持有对方需要的资源,并且自身又不肯释放自己占有的资源,从而导致死锁。

生产死锁的四个条件:

1.互斥条件

资源在某一段时间内只能被一个线程占用

2.不可剥夺条件

一旦资源被线程占用后,其他线程将获取不到,除非占用的线程主动释放

3.请求和保持条件

线程占用资源后,运行中又请求别的资源,对已获得的资源保持不放。

4.循环等待

其他线程同样占有资源,运行中又请求别的资源,对已获得的资源保持不放。从而发生俩个线程互相等待对方释放资源。

死锁问题如何解决:

1.预防死锁

我们知道死锁发生的条件是必须满足上面四个条件,因此只要我们破坏其中一个便可以预防死锁。

1.在线程运行之前一次性分配资源(破坏请求、保持条件)
2.当线程请求资源获取不到时,主动释放占有的资源(破坏不可剥夺条件)
3.对系统的资源进行顺序编号,线程在申请资源时需要按顺序递增的请求资源(破坏循环等待条件)

2.避免死锁
预防死锁会让我们的系统性能变差,因此可以在程序运行中通过一些方法来避免死锁。例如使用银行家算法避免死锁

3.解除死锁

1.剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;

2.撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

发布了194 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39027256/article/details/103765667