死锁是什么及如何避免?

232 阅读1分钟

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信造成阻塞的一种表现。

举例:有两个线程A,B。 线程A先获取了锁a再想获取锁b,线程B则先获取了锁b再想获取锁a。此时如果同时启动这两个线程,会发现主线程一直会在执行状态,无法结束。

排查死锁问题可以通过jDK工具:jsp,jstack,jconsole来排查。

如何避免死锁?

  1. 正确的顺序获得锁。 上述例子就可以通过把获得锁的代码抽取成一个公共方法。

2.当线程获取锁超时了则放弃,这样就避免了出现死锁获取的情况。当使用synchronized关键词提供的内置锁时,只要线程没有获得锁,那么就会永远等待下去,然而Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。通过这种方式,也可以很有效地避免死锁。