//死鎖小程序,經常發生在同步中嵌套同步
public class DeadLock {
public static void main(String[] args) {
new Thread(new DeadLockThread(true)).start();
// 如果讓線程休眠一毫秒,發現有時能鎖上有時鎖不上。休眠兩毫秒基本鎖不上。
// 這說明判斷鎖還是比較耗時的操作
// try {
// Thread.sleep(1);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
new Thread(new DeadLockThread(false)).start();
}
}
class DeadLockThread implements Runnable {
private boolean flag;
public DeadLockThread(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
// TODO Auto-generated method stub
if (flag) {
// 同步中嵌套同步
// 一個線程執行if裏面的,一個線程執行else裏面的
synchronized (MyLock.locka) {
System.out.println("if...locka");
synchronized (MyLock.lockb) {
System.out.println("if...lockb");
}
}
} else {
synchronized (MyLock.lockb) {
System.out.println("else...lockb");
synchronized (MyLock.locka) {
System.out.println("else...locka");
}
}
}
}
}
// 定義一個類來創建兩把鎖
class MyLock {
static Object locka = new Object();
static Object lockb = new Object();
}
運行結果:
if...locka
else...lockb
程序死鎖住了。