title : 每日深耕,勤练不缀之死锁定位,修复,预防

模拟定位问题,就选取常见的jstack,可以使用jps或者系统的ps命令、任务管理器等工具,确定进程ID
其次,调用jstack获取线程栈:

${JAVA_HOME}\bin\jstack your_pid

仔细看,有一个线程掌握的一个锁恰好是下一个线程需要的锁

具体步骤是:
区分线程状态—>查看等待目标—>对比monitor等持有状态
所以,理解线程基本状态和并发相关元素是定位问题的关键,然后调用栈结构,可以找到问题

如果我们开发自己的管理工具,遇到死锁,可以用更加程序化的方式扫描服务进程、定位死锁,可以考虑使用javaAPI:ThreadMXBean,直接提供了findDeadlockedThreads()方法用于定位

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class FindDeadLocked {public static void main(String[] args) throws InterruptedException {ThreadMXBean mbean = ManagementFactory.getThreadMXBean();//容器Runnable dlCheck = new Runnable() {@Overridepublic void run() {long[] threadIds = mbean.findDeadlockedThreads();if (threadIds != null) {//检查所有线程ThreadInfo[] threadInfos = mbean.getThreadInfo(threadIds);System.out.println("Detected deadlock threads");for(ThreadInfo threadInfo:threadInfos){System.out.println(threadInfo.getThreadName());}}}};//并发包中的方法ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);//稍等5秒,然后每10秒进行一次死锁扫描scheduler.scheduleAtFixedRate(dlCheck,5L,10L, TimeUnit.SECONDS);}
}

预防死锁
发生死锁的原因主要有三点:
1.互斥条件,类似于java中的Monitor都是独占的,要不是我用,要不是你用
2.互斥条件长期持有,在使用结束之前,自己不会释放,也不能被其他线程抢占
3.循环依赖关系,两个或者多个个体之间出现了锁的链条环 第一种方法:尽量避免使用多个锁,嵌套的synchronized或者lock非常容易出问题
设计时,既要支持阻塞模式,又要支持非阻塞模式就很容易出问题

//Thread HttpClient-6-SelectorManager
readlock.lock();
writelock.lock();
//持有readlock/writelock,调用close()需要获得closelock
close();
//Thread HttpClient-6-Worker-2持有closelock
implCloseSelectableChannel();//向获得readlock

进入死锁!!
所以不能赋予代码太多的职责

第二种方法:
尽量设计好锁的顺序
反例:

时序问题下,可能造成死锁

第三个方法:
使用带超时的方法,为程序带来更多可控性
Object.wait(…)
第四个方法:
FindBugs来尝试使用固定的模式寻找死锁定位,但是现在仍有多欠缺。所以Java官方文档提供了相应JVM参数和基本原则。

死锁如何定位,修复?及其预防?相关推荐

  1. 2.42死锁的处理策略一预防死锁

    2.42死锁的处理策略一预防死锁

  2. 死锁(死锁的发生条件、预防死锁、避免死锁)

    死锁 什么是死锁 各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象. 进程死锁.饥饿.死循环的区别 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象.比如:在短进程优先(SP ...

  3. 死锁发生的条件和预防

    所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. ...

  4. 一次java线程死锁的定位

    ETL流程卡死原因定位 一.现象:模板大量并发执行流程,经常流程节点脚本运行完成之后,卡死,不更新状态,不继续往下执行.查看日志未发现任何异常信息. 二.定位. jps -ml查看进程号pid,然后j ...

  5. c++产生死锁的必要条件?已经如何预防死锁?

    产生死锁的必要条件?已经如何预防死锁? 一.计算机系统中的死锁 二.产生死锁的必要条件 三.处理死锁的方法 四.预防死锁 五.解决死锁 一.计算机系统中的死锁 竞争不可抢占性资源引起死锁 竞争可消耗资 ...

  6. 线上频繁发生Full GC 如何调优?如何快速定位OOM、cpu飙升、线程死锁等问题

    文章目录 1. jvm调优命令.工具介绍 ①:jps ②:jmap 查看应用中各实例生成情况 快速定位内存突然飙升导致的OOM异常 查看堆内存使用情况 ③:Jstack 检测线程死锁 快速定位导致cp ...

  7. 面试中死锁的考点总结(死锁的定义、产生原因、四个必要条件、如何预防)

    死锁 死锁定义:死锁指多个进程因竞争资源而造成的一种互相等待的僵局,若无外力作用,这些进程都无法向前推进,就造成了死锁. 产生原因:1.竞争资源 2.进程请求和释放资源的顺序不当,导致死锁 死锁产生的 ...

  8. javacore分析工具_线上死锁定位分析

    " 记录一次线上死锁的定位分析."        昨晚睡觉前提了点代码到 jfoa(https://github.com/JavaFamilyClub/jfoa) 怎么也没想到导致 ...

  9. 预防死锁的方法以及死锁的检测与解除

    3.6 预防死锁的方法 一.预防死锁 二.系统安全状态 三.利用银行家算法避免死锁 预防死锁和避免死锁这两种方法,实质上都是通过施加某些限制条件,来预防发生死锁: 两者的区别主要在于: 预防死锁: 施 ...

最新文章

  1. STL - 容器 - Set
  2. mysql使用数据库_MySQL数据库的常用操作
  3. 怎么new一个指针_19. Go语言里的 make 和 new 有什么区别?
  4. 第10步 (1)logback.xml日志配置(2) ftp(上传文件)服务器配置(3) idea注入和自动编译配置(4)项目提交gitee(5)fe助手和restlet client
  5. 编译我的hello.ko
  6. win10配置mysql8.0_Win10下mysql 8.0.20 安装配置方法图文教程
  7. 网络规划设计师考试总结
  8. 回溯法 批处理作业调度_不懂调度系统架构,就不要谈银行数据仓库
  9. pillow 图像 基本概念
  10. PyTorch命令行中执行python程序使用指定的GPU
  11. 聊聊手游的那些惊喜与惊吓
  12. git配置ssh秘钥(公钥以及私钥)windows
  13. 构建Flex应用的10大误区
  14. Sqlite Developer 3.8 破解
  15. 在美团,我从暑期实习到转正
  16. 路由器硬件升级和软件改造
  17. 屏幕快照之旅:Android 4.2 Jelly Bean的10个新功能
  18. oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
  19. MAC安装Securecrt破解
  20. 使用Java合并excel的sheet的操作

热门文章

  1. 面试后别忘了说“谢谢”
  2. Linux系统用户管理和su、sudo详细讲解
  3. python 公园、绿地、饭店等任何一种poi类型信息数据的爬取
  4. [转载]什么叫资源整合? 看懂了多赚一个亿!
  5. pthread_create failed: Resource temporarily unavailable
  6. Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 2.2 Spring Cloud Eureka 进阶
  7. Hadoop HA 搭建(三台主机)
  8. 带有单位的Excel表格如何计算乘积
  9. 形容计算机老师风采的句子,形容老师讲课好的句子,赞美讲课讲得好的句子,形容讲课讲得好的句子...
  10. 黑苹果 未能与恢复服务器取得联系,Hackintosh百分百解决iMessage与Facetime不能登录问题...