死锁是因为不同的线程都在等待根本不可能释放的锁,导致所有的任务都无法完成,会造成线程的假死。
我们可以通过让两个线程互相获取对方正在持有的锁来实现:
源代码:
DealThread.java
package chapter2;
public 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(username.equals("a")){
synchronized (lock1){
try {
System.out.println("username = " + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println("按lock1 -> lock2顺序执行了");
}
}
}
if(username.equals("b")){
synchronized (lock2){
try {
System.out.println("username = " + username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1){
System.out.println("按lock2 -> lock1顺序执行了");
}
}
}
}
}
Run.java
package chapter2;
//两个线程,互相等待取得对方的锁
public class Run {
public static void main(String[] args) {
try {
DealThread t1 = new DealThread();
t1.setFlag("a");
Thread thread1 = new Thread(t1);
thread1.start();
Thread.sleep(100);
t1.setFlag("b");
Thread thread2 = new Thread(t1);
thread2.start();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
打印结果为:
username = a
username = b