死锁是开发中必须要避免的问题,它会导致线程运行不下去,功能出现问题。下面介绍四种定位死锁的方法。
1. 死锁例子
首先,先来看一个简单的死锁例子
public class SynchronizedTest {
public static void main(String[] args) throws InterruptedException {
DealThread t1 = new DealThread();
t1.setFlag("a");
Thread thread1 = new Thread(t1);
thread1.start();
Thread.sleep(1000);
t1.setFlag("b");
Thread thread2 = new Thread(t1);
thread2.start();
}
static class DealThread implements Runnable{
public String username;
public Object lock1 = new Object();
public Object lock2 = new Object();
public void setFlag(String username) {
this.username = username;
}
@Override
public void run() {
if("a".equals(username)) {
synchronized (lock1) {
try {
System.out.println("username= " + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lock2) {
System.out.println("按lock1->lock2代码顺序执行了");
}
}
}
if("b".equals(username)) {
synchronized (lock2) {
try {
System.out.println("username= " + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lock1) {