Java程序中的死锁

什么是死锁?

        死锁是一种特定的程序状态,主要是由于循环依赖导致彼此一直处于等待中,而使得程序陷入僵局,相当尴尬。死锁不仅仅发生在线程之间,而对于资源独占的进程之间同样可能出现死锁。通常来说,我们所说的死锁,是指两个或多个线程之间,由于互相持有对方所需要的锁,进而产生永久阻塞的情况。举个栗子,线程1手里有锁A,它想要获得锁B,与此同时,线程2手里有锁B,它想要获得锁A,相持不下,那么这两个线程将永远地等待下去。

一句话,计算机资源有限,大家互相占着资源而不放手,还想要更多,导致计算机say no.

如图


死锁

定位死锁

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


死锁的诞生

        1.互斥条件 资源独占,若其他进程使用,必须等待;

        2.长期持有 死锁一直存在,自己不会释放,也不能被释放; 

        3.循环依赖关系 彼此等待,形成进程循环等待环。


痛快一点的处理方法:网管,重启


如何防患?

         1.尽量避免使用多个锁(如果有可能的话)。

         2.规范的使用多个锁,并设计好锁的获取顺序。

         3.随用随放。即是,手里有锁,如果还要获得别的锁,必须释放全部资源才能各取所需。

         4.规范好循环等待条件。比如,使用超时循环等待,提高程序可控性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,334评论 4 56
  • 操作系统概论 操作系统的概念 操作系统是指控制和管理计算机的软硬件资源,并合理的组织调度计算机的工作和资源的分配,...
    野狗子嗷嗷嗷阅读 12,085评论 3 34
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,447评论 1 14
  • 人的一生,不可能一帆风顺,都是在磕磕碰碰中成长。我的工作也是一样,虽然在各种因素的影响下,我对我的职业极度的厌倦,...
    alisha123阅读 227评论 0 0
  • 程序员应该这样理解IO 引言 很多程序员会谈及IO,仿佛是种时尚或者给自己贴金的方式,因为提上它一般会涉及应用程序...
    墙角儿的花阅读 32,393评论 8 57