进程线程与死锁(死锁产生原因、条件)及解决办法

一、死锁的定义

多进程,多线程的并发执行虽然提升了系统资源的利用率,提高了系统的性能,但是并发执行也带来了新的问题-----死锁。

死锁是指多个进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象(互相挂起等待),若无外力作用,它们都将无法推进下去——永远相互等待。

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

二、几种常见的死锁

1.线程将自己锁住

为了保证线程之间的同步和互斥,我们往往需要给其加锁,有时候,线程申请了锁资源,还没有等待释放,又一次申请这把锁,结果就是挂起等待这把锁的释放,但是这把锁是被自己拿着,所以就会永远挂起等待,就造成了死锁。

2.多线程竞争资源循环等待

有两个线程P1和P2,P1首先申请得到了锁L1,P2申请得到了锁L2,这个时候P1有向去申请锁L2,结果是被挂起等待P2释放锁L2,而P2恰好也想申请锁L1,结果是挂起等待P1释放锁L1,此时就造成两个线程互相僵持,造成死锁。

3.进程推进顺序不当引起的死锁问题

有三个线程,P1,P2和P3,分别生产数据M1,M2,M3,同时分别接收别的线程产生的数据M3,M2,M1,如果线程推进的顺序正确,即三个线程都先生产数据,再接收,那么没有问题,但是一旦线程先接受数

你可能感兴趣的:(Java基础,计算机网络)