`
hbxflihua
  • 浏览: 676187 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

什么情况下Java程序会产生死锁?如何定位和修复死锁

阅读更多

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于相互持有对方需要的锁,而永久处于阻塞的状态。

 

定位死锁最常见的方式就是利用jstack等工具获取线程栈,然后定位相互之间的依赖关系,进而找到死锁。如果是比较明显的死锁,往往jstack等就能直接定位,类似jconsole甚至可以在图形界面进行有限的死锁检测。

 

如果程序运行时发生了死锁,绝大多数情况下都是无法在线解决的,只能重启、修正程序本身的问题。所以,代码开发阶段玄乎审查,或者利用工具进行预防性排查,往往也是很重要的。

 

Java提供了标准的管理API-ThreadMXBean来进行死锁的定位跟踪,示例代码如下:

 

public static void main(String[] args) throws InterruptedException {

	ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
	Runnable dlCheck = new Runnable() {

    	@Override
    	public 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、如果可能,尽量避免使用多个锁,并且只有在需要时才持有锁,嵌套synchronizedlock很容易产生死锁。

2、如果必须使用多个锁,尽量设计好锁的获取顺序。

3、使用带超时的方法,为程序带来更多的可控性。

分享到:
评论

相关推荐

    基于Java的多线程程序死锁检查 JCarder.zip

    在Java编程环境中,多...`JCarder`作为一个有效的死锁检测工具,能够帮助开发者及时发现和修复死锁问题,提高程序的稳定性和性能。在实际开发中,结合使用各种线程同步机制和工具,可以更好地管理和优化多线程程序。

    基于Java的源码-多线程程序死锁检查 JCarder.zip

    - **处理死锁**: 根据报告,开发者可以定位并修复引发死锁的问题,例如调整锁的获取顺序,避免循环等待,或者使用更高级的同步机制,如读写锁、条件变量等。 **3. 避免死锁的策略** - **避免嵌套锁**: 尽量减少线程...

    Java多线程程序死锁检查类库 JCarder

    在实际开发中,JCarder可以作为一种有效的调试工具,尤其是在复杂多线程环境下,能够帮助开发者及时发现并修复可能导致死锁的问题,提高程序的健壮性和可靠性。同时,通过学习和使用JCarder,开发者也能更深入地理解...

    死锁查找与排除工具

    标题中的“死锁查找与排除工具”指的是专门用于检测和解决数据库系统中死锁问题的软件工具。在数据库管理系统(DBMS)中,...通过这个工具,数据库管理员可以更高效地排查和修复死锁,保障数据库服务的稳定性和性能。

    JAVA项目更新升级程序

    在IT行业中,Java项目更新升级程序是一个至关重要的环节,它涉及到软件生命周期的维护阶段,确保应用程序能够持续地适应用户需求的变化和技术的演进。在这个特定的"JAVA项目更新升级程序"中,我们可以深入探讨以下几...

    java问题定位技术

    Java问题定位技术是Java开发过程中不可或缺的一环,它涉及到对应用程序的性能监控、错误排查以及异常处理等多个方面。...通过使用各种工具和理解Java核心技术,开发者可以更有效地定位和修复问题,提升软件质量。

    java问题定位

    Java问题定位是指在Java应用程序运行过程中,通过一系列技术和工具来发现并解决程序中出现的各种问题的过程。这包括但不限于识别异常、性能瓶颈以及内存泄漏等问题,并采取相应的措施来修复它们。 ##### 1.2 常见...

    Java程序性能优化.葛一鸣.2012.10.第1版

    《Java程序性能优化》是葛一鸣在2012年10月出版的第一版专著,这本书深入探讨了如何提升Java应用程序的运行效率和性能。在Java开发中,性能优化是一个关键领域,它涉及到代码的高效编写、内存管理、线程调度、数据库...

    Java语言程序设计上机实验报告

    调试是程序员日常工作中必不可少的一部分,学习如何通过Java的断点、步进执行、变量观察等工具来定位和修复错误,对于提高代码质量至关重要。 实验2“方法设计”关注的是代码的模块化和重用性。在Java中,方法是...

    Java问题定位技术.zip_Java 问题排查_Java问题定位技术_定位_定位系统

    Java问题定位技术是Java开发者日常工作中不可或缺的一部分,它涉及到如何高效地发现、分析并解决程序运行时出现的各种问题。这份名为“Java问题定位技术”的文档很可能是为了帮助开发者们掌握这一技能而准备的。以下...

    Java语言程序的错误类型和产生原因.zip

    在编写Java程序时,开发者可能会遇到各种类型的错误,这些错误不仅会影响程序的正常运行,而且也是学习和提升编程技能的重要环节。下面我们将深入探讨Java语言程序中的错误类型及其产生原因。 1. **编译错误 ...

    Java语言的程序漏洞检测与诊断技术应用研究.zip

    Java语言的程序漏洞检测与诊断技术是软件开发过程中的关键环节,它关乎程序的安全性和稳定性。随着Java在互联网、企业级应用以及大数据处理等领域的广泛应用,理解和掌握这些技术显得尤为重要。本文将深入探讨Java...

    IBM Java Analyzer 4.34

    IBM Java Analyzer 4.34 是一款专门针对Java应用程序性能监控和故障排查的工具,尤其在处理javacore和heapdump文件方面表现出色。这款工具是IBM为优化其JVM(Java虚拟机)运行环境而设计的,它帮助开发者和系统管理...

    Java语言的程序漏洞检测与诊断技术.pdf

    确定性重现技术是一种检测和诊断Java程序漏洞的有效方法,该技术可以检测并发程序中的漏洞,例如死锁、 livelock、 starvation 等问题,并且可以对这些漏洞进行诊断和修复。 Java语言的程序漏洞检测和诊断技术是...

    java线程分析工具TDA

    在实际开发中,结合`jstack`和TDA,我们可以定期收集线程堆栈,分析应用在高负载或特定条件下的行为,及时发现并修复潜在的问题。这不仅可以提升应用质量,也有助于提升开发团队的故障排查能力,减少因多线程问题...

    JavaDump分析

    对于开发人员来说,分析JavaDump是定位和修复Bug的强有力工具,特别是对于那些传统代码调试和日志记录无法解决的深层次问题。在开发阶段,JavaDump可以帮助发现功能正确性的问题;在功能测试和性能测试阶段,它可以...

Global site tag (gtag.js) - Google Analytics