美文网首页
如何避免死锁

如何避免死锁

作者: squirrels | 来源:发表于2020-12-01 10:52 被阅读0次

避免死锁主要有 3种方式

  1. 加锁顺序
  2. 加锁时限
  3. 死锁检测

加锁顺序

一个线程如果要获取多个锁,必须按照一定的顺序去获取,比如要获取A B C 三把锁,我们规定,必须获取到了 AB 两把锁,才能去获取 C锁

举个例子 现在有两个线程 都要去获取 ABC 三把锁

然后 1号 线程 获取到了 A 和 B 两把锁
2号 线程获取了 C锁

于是 1号线程在等待 2号线程释放锁C锁
2号线程在等待 1 号线程释放 A 和 B 锁
于是出现了死锁
现在采用加锁队列后,必须先 获取 A 和 B 才能获取C锁,所以 2号线程就没有机会在没有获取 AB 的情况下拿到C锁,就不会出现死锁问题
这个策略的最大问题是,你必须提前知道所有用到的锁,这个有些时候难以预测

加锁时限

一个线程尝试去获取锁,如果在指定的时间内获取不到,就放弃等待锁,并释放自己现在所持有的锁,然后随机等待一定时间,再去获取锁
这里要注意的是 ,等待的时间一定要是随机,不然可能出现 两个线程都释放资源,然后等待相同时间,然后再一起去获取锁,于是又死锁,这种现象称为活锁

死锁检测

利用数据结构,如 一个map,然后每次线程的上锁,和获取不到锁,都记录在里面,当一个线程获取不到锁的时候,就去便利查看这个map,看一下有没有死锁,有的话就将整个map里所有的锁全部释放,然后各个线程稍作等待,再去竞争锁。
这里还可以优化下,设置优先级,释放所有锁的时候,不释放优先级高的锁,能提高性能。

相关文章

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

  • 如何避免死锁

    死琐 A线程持有a锁,等待获取b锁;同时B线程持有b锁,等待获取a锁。 死琐条件 -- 独占锁: 互斥:资源不能被...

  • 如何避免死锁

    避免死锁主要有 3种方式 加锁顺序 加锁时限 死锁检测 加锁顺序 一个线程如果要获取多个锁,必须按照一定的顺序去获...

  • 线程死锁,死锁条件,如何避免死锁

    死锁:有两个或两个以上线程相互持有对方所需要的资源,而使得这些线程无法往下执行下去。在Java中程序执行进入对象的...

  • 如何快速排查死锁?如何避免死锁?

    前言 相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的...

  • 什么是死锁,如何避免死锁

    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去...

网友评论

      本文标题:如何避免死锁

      本文链接:https://www.haomeiwen.com/subject/xuxziktx.html