先介绍几个概念
线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现线程不安全的问题。重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。
举例:若现在有两个线程1和线程2,有A和B两份资源,线程1和线程2的执行都需要AB资源。某一时刻出现某种情况:线程1占用A资源,线程2占用B资源,而线程1需要B资源才能往下执行,线程2需要A资源才能往下执行,这样两个线程互相等待,就出现了最简单的死锁现象
想要避免的死锁可以从以下角度考虑:①破坏死锁的四个必要条件 ②加锁顺序一致③避免锁未释放的场景④资源一次性分配
设置等待超时,当一个线程拿起A资源,等待B资源的时候,如果等待的时间过长则超时,释放A资源,重新等待。
如果线程需要AB两个资源,等待A资源的时候阻塞,然后判断B资源是否可以使用,如果B资源正在被别的线程使用,那么该线程就释放A资源,不阻塞,从新排队等待。(银行家算法)
死锁检测算法