写一个由于多变量的synchronized顺序使用不当引起的死锁。
public class BadLock {
public static void main(String[] args) {
Locklock locklock = new Locklock();
Thread thread1 = new Test1(locklock);
Thread thread2 = new Test2(locklock);
thread1.start();
thread2.start();
if (thread1.isAlive() && thread2.isAlive()) {
System.out.println("all thread has alive and running..");
}
}
}
class Locklock {
private Object obj1 = new Object();
private Object obj2 = new Object();
public void lockObj1() throws InterruptedException {
synchronized (obj1) {
// sleep并不释放锁
Thread.sleep(1);
synchronized (obj2) {
while (true) {
System.out.println(Thread.currentThread().getName());
}
}
}
}
public void lockObj2() throws InterruptedException {
synchronized (obj2) {
// sleep并不释放锁
Thread.sleep(1);
synchronized (obj1) {
while (true) {
System.out.println(Thread.currentThread().getName());
}
}
}
}
}
class Test1 extends Thread {
Locklock locklock1;
public Test1(Locklock locklock1) {
// TODO Auto-generated constructor stub
this.locklock1 = locklock1;
Thread.currentThread().setName("thread1");
}
@Override
public void run() {
try {
locklock1.lockObj1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}
class Test2 extends Thread {
Locklock locklock;
public Test2(Locklock locklock) {
// TODO Auto-generated constructor stub
this.locklock = locklock;
Thread.currentThread().setName("thread2");
}
@Override
public void run() {
try {
locklock.lockObj2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}