死锁
死锁是两个或两个以上的线程在竞争资源而导致的,下面给出一个简单地例子。
/**
* created by Yinevg on 2018/12/29
*/
public class Main {
public static void main(String[] args) {
Object lock1 = new Object();
Object lock2 = new Object();
ThreadA threadA = new ThreadA(lock1, lock2);
ThreadB threadB = new ThreadB(lock1, lock2);
threadA.start();
threadB.start();
}
}
class ThreadA extends Thread {
private Object lock1;
private Object lock2;
ThreadA(Object lock1, Object lock2) {
super();
this.lock1 = lock1;
this.lock2 = lock2;
}
@Override
public void run() {
synchronized (lock1) {
System.out.println("ThreadA gets lock1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("ThreadA gets lock2");
}
System.out.println("ThreadA releases lock2");
}
System.out.println("ThreadA releases lock1");
}
}
class ThreadB extends Thread {
private Object lock1;
private Object lock2;
ThreadB(Object lock1, Object lock2) {
super();
this.lock1 = lock1;
this.lock2 = lock2;
}
@Override
public void run() {
synchronized (lock2) {
System.out.println("ThreadB gets lock2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("ThreadB gets lock1");
}
System.out.println("ThreadB releases lock1");
}
System.out.println("ThreadB releases lock2");
}
}
这里线程A获取了锁1,线程B获取了锁2。此时线程A需要获取锁2才能往下执行,线程B需要获取锁1才能往下执行。但线程A和线程B都不释放自己已经获取到的锁,都在等待对方释放锁,从而导致了死锁。执行这段代码会输出:
ThreadA gets lock1
ThreadB gets lock2
jconsole
ctrl+r,在命令行输入jconsole,弹出界面,选择对应的进程
可以看到已经发生了死锁。
jps+jstack
使用jps查看对应进程的id,这里得到id为3652
使用jstack -l 3652获取相关信息
可以发现已经出现了死锁。