1. 程式人生 > 實用技巧 >Java—死鎖

Java—死鎖

一、死鎖

同步鎖使用的弊端:當執行緒任務中出現了多個同步(多個鎖)時,如果同步中嵌套了其他的同步。這時容易引發一種現象:程式出現無限等待,這種現象我們稱為死鎖。

public class DeadLockTest {
	public static void main(String[] args) {
		DeadLock deadLock = new DeadLock();
		Thread t1 = new Thread(deadLock);
		Thread t2 = new Thread(deadLock);
		
		t1.start();
		t2.start();
	}
}

class DeadLock implements Runnable{
	int x = new Random().nextInt(1);//0,1

	Object lockA = new Object();
	Object lockB = new Object();
	@Override
	public void run() {
		while(true){
			if(x % 2 == 0){
				synchronized (lockA) {
					System.out.println("if-lockA");
					synchronized (lockB) {
						System.out.println("if-lockB");
						System.out.println("if-大口吃肉");
					}
				}
			}else{
				synchronized (lockB) {
					System.out.println("else-lockB");
					synchronized (lockA) {
						System.out.println("else-lockA");
						System.out.println("else-大口吃肉");
					}
				}
			}
			x++;
		}
	}
	
}

二、等待喚醒機制

執行緒之間的通訊:多個執行緒在處理同一個資源,但是處理的動作(執行緒的任務)卻不相同。通過一定的手段使各個執行緒能有效的利用資源。而這種手段即—— 等待喚醒機制

  • wait() : 等待,將正在執行的執行緒釋放其執行資格和執行權,並存儲到執行緒池中。
  • notify():喚醒,喚醒執行緒池中被wait()的執行緒,一次喚醒一個,而且是任意的。
  • notifyAll(): 喚醒全部:可以將執行緒池中的所有wait() 執行緒都喚醒。

所謂喚醒的意思就是讓 執行緒池中的執行緒具備執行資格。必須注意的是,以上方法都是在同步中才有效。同時這些方法在使用時必須標明所屬鎖,這樣才可以明確出這些方法操作的到底是哪個鎖上的執行緒。

  • join() : 當前執行緒等待其它執行緒結束