什么是死锁
死锁,简单来说就是两个或者多个的线程在执行的过程中,争夺同一个共享资源造成的相互等待的现象。如果没有外部干预线程会一直阻塞下去.
导致死锁的原因
-
互斥条件,共享资源 X 和 Y 只能被一个线程占用;
-
请求和保持条件,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
-
不可抢占条件,其他线程不能强行抢占线程 T1 占有的资源;
-
循环等待条件,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。
导致死锁之后,只能通过人工干预
来解决,比如重启服务,或者杀掉某个线程 !!!
如何解决
只要打破以上四个条件其中一个就可以解决死锁, 除了互斥条件无法打破
-
对于“请求和保持”这个条件,我们可以一次性申请所有的资源,这样就不存在等待了。
-
对于“不可抢占”这个条件,占用部分资源的线程进一步申请其他资源时,如果申不到,可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。
-
对于“循环等待”这个条件,可以靠按序申请资源来预防, 是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的, 这样线性化后自然就不存在循环了。