
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了Java编程开发中常用的锁的类型等内容,而本文我们就继续来学习一下,Java编程死锁概念与产生条件分析。
1、死锁
死锁的定义
发生在并发中
当两个线程(或更多)线程(或线程)相互持有对方所需要的资源,又不主动释放,导致所有线程都无法继续执行,是程序陷入无尽的阻塞,这就是死锁。
如果多个线程之间的依赖关系是环形,存在环形的锁的依赖关系,那么也可能会发生死锁。
2、死锁的影响
死锁的影响在不同的系统中是不一样的,这取决于系统对死锁的处理能力。
数据库中:检测并放弃事务;
JVM中:无法自动处理,但是提供了工具可以帮助我们取检测;
3、程序中的死锁
一旦发生,多是高并发场景,影响用户多;
整个系统崩溃,子系统崩溃,性能降低;
压力测试无法找出所有潜在的死锁;
4、死锁产生的必要条件
产生死锁必须同时满足以下四个条件,只要其中一条不成立,死锁就不会发生。
①互斥条件
进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
②请求与保持条件
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
③不剥夺条件
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
④循环等待条件
存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl,P2,...,pn},其中Pi等待的资源被P(i+1)占有(i=0,1,...,n-1),Pn等待的资源被P0占有。
5、实际开发中如何避免死锁
设置超时时间;
多使用并发类而不是自己设计锁;
尽量降低锁的使用粒度:用不同的锁而不是一个锁;
如果能使用同步代码块,就不使用同步方法:自已指定所对象;
创建线程的时候命名尽量达到见名知义,方便后面排查问题;
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。