死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需的资源。
这种情况可能发生在当两个线程尝试获取其他资源的锁,而每个线程又陷入无线等待其他资源锁的释放,除非一个用户的进程被终止。
线程死锁可能发生在以下的情况:
- 当两个线程相互调用Thread.join();
- 当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,就有可能出现死锁。
举例:在一个单轨的铁路上,两条火车向不同的方向开,谁也动不了。
为什么会出现死锁?
死锁一般都是由于对共享资源的竞争所引起的。但对共享资源的竞争又不一定就会发生死锁。
死锁的发生必需满足4个必要条件:
- 互斥
- 等待/持有
- 非抢占
- 形成等待环