最近做的一个项目使用Java编写,在调试中遇到两种因为调用join()引发的死锁情形,很隐蔽。记录于此。
1.线程join自身发生死锁
1.线程join自身发生死锁
public class Starter {
public static void main(String[] args) {
new DeadThread().start();
}
}
class DeadThread {
public DeadThread() {
thread = new Thread(new RealThread());
}
public void start() {
thread.start();
}
private Thread thread;
private class RealThread implements Runnable{
public void run() {
System.out.println("Thread is starting...");
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread is stopping...");
}
}
}
线程RealThread调用thread.join()本是想与另一个线程同步(示例代码中没有展示),但正如示例代码表现的那样,thread实际指向了它自身,这就形成了一种诡异的死锁情形:一个正在运行中的线程调用join()来等待自己结束。
2.锁的维护不当
相比上面的情形,下面的情景则更为常见。
import java.u