Java併發(二十四)----wait、notify、notifyAll、join區別與聯繫 Java併發(二十二)----同步模式之保護性暫停

1、join

是調用者輪詢檢查線程 alive 狀態,執行後線程進入阻塞狀態。

如在線程B中調用線程A的join(),那線程B會進入到阻塞隊列,直到join結束或中斷線程B纔開始進入阻塞隊列。可以實現一個線程的順序執行。

t1.join();

等價於下面的代碼

synchronized (t1) {
    // 調用者線程進入 t1 的 waitSet 等待, 直到 t1 運行結束
    while (t1.isAlive()) {
        t1.wait(0);
    }
}

注意

join 體現的是【保護性暫停】模式,請參考Java併發(二十二)----同步模式之保護性暫停 中第四小節:帶超時版 GuardedObject

2、wait()和notify()、notifyAll()

1、wait方法用於協調多個線程對共享數據的存取,所以必須在Synchronized語句塊內使用

2、wait()方法使當前線程暫停執行並釋放會cpu資源,以及同步鎖(類鎖和對象鎖)

3、調用wait()後必須調用notify()或notifyAll()後線程纔會從等待池進入到鎖池,當我們的線程競爭得到同步鎖後就會重新進入緒狀態等待cpu資源分配

當調用notify()方法後,將從對象的等待池中移走一個任意的線程並放到鎖標誌等待池中,只有鎖標誌等待池中線程能夠獲取鎖標誌;如果鎖標誌等待池中沒有線程,則notify()不起作用。

notifyAll()則從對象等待池中移走所有等待那個對象的線程並放到鎖標誌等待池中。

注意:

1、這三個方法都是java.lang.Object的方法。

2、notif()方法要配合wait()方法使用,一般在wait()之後調用或者在線程結束時調用纔會成功。

 

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