Java多線程設計模式wait和notify機制總結

Java多線程設計模式wait和notify機制總結:

  • wait和notify方法必須寫在synchronized方法內,即在調用wait和notify方法前,需先獲得對象鎖;
  • 調用wait方法則釋放鎖;wait方法返回後,需獲得對象鎖纔可繼續執行下面語句;
  • 多個線程wait時,若另外的線程調用notify方法後,由JVM決定喚醒其中一個線程;
  • 多個線程wait時,若另外的線程調用notifyAll方法,則喚醒所有wait線程,但是隻有其中一個線程可以獲得對象鎖,執行wait下面的語句,其餘的等待釋放對象鎖後纔可執行;
  • 調用notify/notifyAll時,線程並沒有釋放對象鎖,只是其餘線程被喚醒,但仍無法執行,只有等調用完notify/notifyAll並退出synchronized塊,釋放對象鎖後,其餘線程中的一個纔可獲得鎖執行。

另:sleep方法使當前線程暫停執行一段時間,從而讓其他線程有機會繼續執行,但它並不釋放對象鎖。也就是說,如果有Synchronized塊,其他線程仍然不能訪問共享數據。

    舉生產者-消費者例子來說:倉庫提供兩個同步方法,一個put,一個get,假設put方法中線程sleep30秒,在這段時間中,get方法並不能從倉庫中獲取產品,因爲sleep時並沒有釋放對象鎖,所以調用get方法的線程不能執行。

    假設有兩個線程同時執行,都沒有調用synchronized方法,一個線程優先級爲MAX_PRIORITY,另一個爲MIN_PRIORITY,如果沒有sleep()方法,只有高優先級的線程執行完成後,低優先級的線程才能執行;但當高優先級的線程sleep(5000)後,低優先級就有機會執行了。

    即:sleep方法可以使低優先級的線程得到執行的機會,當然也可以讓同優先級、高優先級的線程獲得執行的機會。

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