死锁
死锁就是两个或者两个以上的线程在运行时争夺同一个共享资源导致互相等待的一个现象,如果没有外部干预的话,这几个线程将会一直处于阻塞状态(同步阻塞),无法继续执行。
死锁触发有四个条件:
1.互斥条件:共享资源A和共享资源B只能被一个线程占用。
2.请求和保持条件:线程Thread1占有共享资源A时,在等待共享资源B的时候是不会释放共享资源A的。
3.不可抢占条件:在共享资源A被Thread1线程占有的情况下,其他线程是无法去强行占有共享资源A的。
4.循环等待条件:线程Thread1在等待线程Thread2所占有的资源,而线程Thread2也在等待着线程Thread1所占有的资源。
解决方法
当线程陷入死锁状态,那就只能由外部直接进行干预,可以采用的方法有重启、kill线程等,因此当我们在编写代码时就要去刻意规避死锁的问题,避免同时触发以上四个条件,但其中“互斥条件”属于锁本身的特征,无法破坏这样的规则,而其他三个条件是有对应的解决方案的。
1.请求和保持条件:当我们的锁第一次执行的时候,就一次性申请所有的共享资源。
2.不可抢占条件:如果一个线程已经申请了部分共享资源,但是另一部分申请不到,则主动释放掉所占有的所有共享资源。
3.循环等待条件:给资源一个编号,让线程按照编号顺序去申请资源