死锁的情况和避免方法 红太狼 2022-01-21 23:23 214阅读 0赞 在多线程并发中,就会遇到死锁的情况。 死锁的一个定义就是:**一组互相竞争资源的线程因互相等待,导致永久阻塞的现象。** 比如一组操作需要同时获取两个锁1,2,线程a线程获取锁1的同时,线程b同时获取锁2,那么线程1,2同时去获取对方的锁,而双方本身都又在等待多方的锁,那么就陷入一个无限的死循环中,导致死锁。 只有以下情况都发生时才会出现死锁: 1.互斥,共享资源X和Y只能被一个线程占用。 2.占用且等待,线程T1已经获得共享资源X,在等待共享资源Y的时候,不释放共享资源X; 3.不可抢占,其他线程不能强行抢占线程T1占有的资源。 4.循环等待,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,就是循环等待。 那么解决问题的方法就在于破坏线程死锁的条件,导致影响线程死锁的条件不成立即可。 1.破坏占用且等待的条件。即只要一个线程需要获取2个锁时才能进行的操作,那么我们只要建立一个对象,对象去同时获取2个锁,再来个方法同时释放2个锁。这样任意线程去获取的时候,要么都拿到锁进行操作,其余没拿到锁的线程就进行等待。 2.破坏不可抢占的条件。主动释放资源,即如果当前线程获取不到全部的锁,那么主动释放自身拥有的锁,等待全部获得锁的机会。 **3.破坏循环等待条件**。 要想破坏这个条件,必须对资源进行排序,然后按序申请资源。根据获取的Id比较大小,按照从小到大顺序来申请锁,这样就不会存在循环等待的条件了。**这样有点乐观锁的感觉。** 为啥这样做能解决循环等待问题。因为当2个线程去获取锁,按照从小到大的情况排序去获取锁,那么大于等于2个线程去获取,只会其中一个线程拿到最小的锁,才能去拿第二锁,如果连第一个锁都拿不到,自然其他线程就不能进入第二个锁的获取代码部分。于是便解决了循环等待问题。 总结:当加锁的时候,就要想到避免死锁的情况。考虑最好的解决方案。
相关 并发编程中的锁机制:如何避免死锁情况 死锁是并发编程中的一种严重问题,当两个或更多的进程在执行过程中因争夺资源而造成的一种互相等待的现象叫做死锁。 避免死锁的情况通常需要遵循以下几个原则: 1. **互斥**( 系统管理员/ 2024年09月17日 03:39/ 0 赞/ 11 阅读
相关 Java并发编程:锁机制的理解和避免死锁的方法 在Java中,锁机制是多线程编程中的一种同步手段,用于保护共享资源,防止竞态条件的发生。 理解锁机制: 1. **独占锁(Lock)**:一个线程获取锁后,其他线程必须等待该 电玩女神/ 2024年09月14日 22:51/ 0 赞/ 10 阅读
相关 Java并发编程:死锁和避免死锁的方法 死锁是多线程编程中的一种严重问题,会导致所有线程都无法继续执行任务。以下是死锁的特征和一些避免死锁的方法: 1. **特征**: - **互斥**:资源被多个线程同时请 待我称王封你为后i/ 2024年09月11日 05:42/ 0 赞/ 18 阅读
相关 什么是死锁?如何避免死锁? 概念 线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 > 我和同学都打扫 以你之姓@/ 2024年04月03日 07:00/ 0 赞/ 53 阅读
相关 死锁以及如何避免死锁 死锁以及如何避免死锁 死锁的定义 死锁通常涉及的四个必要条件 1. 互斥条件 2. 占有且等待条件 3. 非抢占条件 骑猪看日落/ 2024年02月21日 11:14/ 0 赞/ 14 阅读
相关 实际工作中避免死锁的方法 1.设置超时时间 Lock的tryLock(Long timeout,TimeUnit unit) 设置获取锁的时间,如果达到这个时间还没有获取到锁,就回退 左手的ㄟ右手/ 2022年12月29日 12:34/ 0 赞/ 86 阅读
相关 死锁的原因、条件和避免死锁的方法 产生死锁的原因主要是: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 产生死锁的四个必要条件: (1)互斥条件: 深藏阁楼爱情的钟/ 2022年08月05日 05:28/ 0 赞/ 169 阅读
相关 Linux 死锁的产生及其避免方法 文章目录 引言 何谓死锁 死锁产生的四个条件 死锁的预防 避免死锁 引言 我们看一个场景--- 朱雀/ 2022年03月07日 17:12/ 0 赞/ 248 阅读
相关 死锁的情况和避免方法 在多线程并发中,就会遇到死锁的情况。 死锁的一个定义就是:一组互相竞争资源的线程因互相等待,导致永久阻塞的现象。 比如一组操作需要同时获取两个锁1,2,线程a线程获取锁 红太狼/ 2022年01月21日 23:23/ 0 赞/ 215 阅读
还没有评论,来说两句吧...