1.四个条件
死锁的定义:
多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
可重入锁
站在锁对象的角度来说 ,它认为自己已经被另外的线程给占用了,然后进行二次加锁,如果二次加锁成功之后说明这个锁是可重入锁,如果上述操作会进行阻塞等待的话说明是不可重入锁。这个情况就会导致线程无法正常进行,就会产生死锁
死锁的三种情况:
1.一个线程一把锁,连续加锁两次,如果锁是不可重入锁,就会死锁。
2.两个
.线程两把锁,分别获取对方的锁
t1 和 t2 各自先针对 锁A 和锁B 加锁,再次尝试获取对方的锁,但是锁都是被双方各自获得,都要相互等待对方释放锁,因此进入循环等待,这样就会产生死锁
3.多个线程多把锁
大家都很熟知的我们操作系统书上的经典案例,哲学家就餐问题,五个哲学家一起吃一份面条,桌子上有五根筷子,要想吃面条得有两根筷子,大家都想吃面条,但是筷子只有五根。谁先吃谁后吃,谁说了也不算。极端情况下大家都想吃面条,都拿起了桌子上的筷子,一人拿了一根,但是没有人有两根筷子,大家就陷入了僵局,就产生了死锁
上述这三种情况都会产生死锁,我们也讲了死锁产生的四个必要条件,突破口就是循环等待
办法就是给锁编号,然后指定一个固定顺序(比如从小到大)来加锁,任意线程加多把锁的时候,都让线程遵守上述规则·,此时循环等待自然破除。就像上述的哲学家就餐的问题,我们把筷子进行一个编号,让大家先拿编号小的筷子,顺序从小到大,大家依次拿起筷子,但是现在筷子有了顺序了,一号筷子旁的两个哲学家就会竞争这根筷子,只能被一个人拿到,另一个人就会阻塞等待,这时候五号筷子就会剩下,拿四号筷子的哲学家就可以拿五号和四号来吃面条,吃完后把两根筷子都放下,拿三号筷子的哲学家也就可以吃面了,以此类推,循环等待问题就迎刃而解了。