死鎖小程序

//死鎖小程序,經常發生在同步中嵌套同步
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

程序死鎖住了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章