什么情况下java程序会产生死锁?如何定位和修复死锁 -凯发k8国际

`
hbxflihua
  • 浏览: 649518 次
  • 性别:
  • 来自: 杭州
博主相关
  • 博客
  • 微博
  • 相册
  • 收藏
  • 社区版块
    • ( 0)
    • ( 0)
    • ( 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程序会产生死锁?如何定位、修复?pdf中有介绍

      关于死锁,你知道多少? 本文就什么是死锁?怎么找到死锁?怎么解决死锁?...并发情况下,当两个(或多个)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,程序无限阻

      该工具用来排查线上程序出现内存泄漏或溢出,死锁等相关问题,快速分析堆栈异常情况,找到问题代码进行修复。

      这个问题,经常出现在windows2000和xp系统上,windows 2000/xp对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似windows 98里的非法操作,系统为保持稳定,就会出现上述情况。另外也可能是硬件设备之间的兼容...

      (1) 符合程序员常规的修复检查方法,通过重复执行打过补丁的程序来检查修复,观察一个bug是否会被重新激活,从而没有误报; (2) 我们的方法可以有效地检查修复程序,而无需了解触发错误的原子性违规; (3) 使用 ...

      预期故障可以通过事务程序本身发现,例如在写java程序时,使用try catch就可以捕捉预期故障并处理。在数据库中也可以通过在事务中加入判断来预期。 非预期故障可以理解为意料之外,例如运算溢出、并发事务死锁,违反...

      1.5.3 过多的阻塞和死锁 11 1.5.4 不基于数据集的操作 11 1.5.5 低质量的查询设计 12 1.5.6 低质量的数据库设计 12 1.5.7 过多的碎片 12 1.5.8 不可重用的执行计划 13 1.5.9 低质量的执行计划 13 1.5.10 频繁...

      1.5.3 过多的阻塞和死锁 11 1.5.4 不基于数据集的操作 11 1.5.5 低质量的查询设计 12 1.5.6 低质量的数据库设计 12 1.5.7 过多的碎片 12 1.5.8 不可重用的执行计划 13 1.5.9 低质量的执行计划 13 1.5.10 频繁...

       bob bryla是oracle 9i和10g的认证专家,他在数据库设计、数据库应用程序开发、培训和oracle数据库管理等方面拥有20多年的工作经验,他也足dodgeville的land'end公司的首席internet数据库设计师和oracle dba. ...

       bob bryla是oracle 9i和10g的认证专家,他在数据库设计、数据库应用程序开发、培训和oracle数据库管理等方面拥有20多年的工作经验,他也足dodgeville的land'end公司的首席internet数据库设计师和oracle dba. ...

      数据库(database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 ...

    global site tag (gtag.js) - google analytics
    网站地图