Java—死鎖
阿新 • • 發佈:2020-11-16
一、死鎖
同步鎖使用的弊端:當執行緒任務中出現了多個同步(多個鎖)時,如果同步中嵌套了其他的同步。這時容易引發一種現象:程式出現無限等待,這種現象我們稱為死鎖。
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() : 當前執行緒等待其它執行緒結束