死锁
什么是死锁?
- 不同的线程在等待根本不可能释放的锁,从而导致线程无法继续运行。通俗的讲,就像男女朋友之间冷战,你等着我道歉,我等着你道歉,造成冷战,最后分手。
例子:
package Thread;
/**
*
* @author zjq
*/
public class lock_die 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(1000);//第一处
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("lock1到lock2");
}
}
}
if (username.equals("b")) {
synchronized (lock2) {
try {
System.out.println("username=" + username);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("lock2到lock1");
}
}
}
}
public static void main(String[] args) {
try {
lock_die lo = new lock_die();
lo.setFlag("a");
Thread a = new Thread(lo);
a.start();
Thread.sleep(100);//第二处
lo.setFlag("b");
Thread b = new Thread(lo);
b.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 运行结果
username=a
username=b
上边的两处sleep是关键,第一处是等待第二处睡眠进行完,以及b线程进入第一个锁持有lock2对象,自己持有lock1对象。第二处是阻止a和b线程的异步。若不加第二处sleep则username永远是b。