死锁
什么是死锁?
死锁是指两个或以上的线程在执行过程中,由于竞争资源从而相互等待造成相互阻塞的现象。现实生活中有很多类似的例子,比如十字路口的拥堵,共享单车额外加个锁等,看几个例子。
十字路口的拥堵
行走时相互让路,造成的相撞
死锁发生的条件:
、资源互斥,一个资源只能一个线程获得
、请求与保持,占用一个资源,并等待其他资源才能执行
、不可抢占,已经占有,别的不能抢夺
、循环等待,你占有一个,别人占有另一个,都相互等待对方的资源。
用上面条件写一个Java一个死锁的例子,定义两个资源a和b,线程1先拥有a,再去获取b,此时线程2已经拥有了b,还在竞争a,从而导致死锁发生。
死锁的例子
用jstack查看线程栈信息,会发现两个线程都阻塞了,都在相互等待。
jstack查看线程信息
避免死锁的方式,一般有几种办法。
1、避免一个线程同时获取多个锁,
2、避免在一个锁期间获取多个资源
3、用定时锁,设置个合理的超时时间
领取专属 10元无门槛券
私享最新 技术干货