首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中的死锁deadlock分析

死锁

什么是死锁?

死锁是指两个或以上的线程在执行过程中,由于竞争资源从而相互等待造成相互阻塞的现象。现实生活中有很多类似的例子,比如十字路口的拥堵,共享单车额外加个锁等,看几个例子。

十字路口的拥堵

行走时相互让路,造成的相撞

死锁发生的条件:

、资源互斥,一个资源只能一个线程获得

、请求与保持,占用一个资源,并等待其他资源才能执行

、不可抢占,已经占有,别的不能抢夺

、循环等待,你占有一个,别人占有另一个,都相互等待对方的资源。

用上面条件写一个Java一个死锁的例子,定义两个资源a和b,线程1先拥有a,再去获取b,此时线程2已经拥有了b,还在竞争a,从而导致死锁发生。

死锁的例子

用jstack查看线程栈信息,会发现两个线程都阻塞了,都在相互等待。

jstack查看线程信息

避免死锁的方式,一般有几种办法。

1、避免一个线程同时获取多个锁,

2、避免在一个锁期间获取多个资源

3、用定时锁,设置个合理的超时时间

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200303A0T5LC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券