基于Java多線程notify與notifyall的區(qū)別分析
當(dāng)一個(gè)線程進(jìn)入wait之后,就必須等其他線程notify/notifyall,使用notifyall,可以喚醒
所有處于wait狀態(tài)的線程,使其重新進(jìn)入鎖的爭(zhēng)奪隊(duì)列中,而notify只能喚醒一個(gè)。注意,任何時(shí)候只有一個(gè)線程可以獲得鎖,也就是說只有一個(gè)線程可以運(yùn)行synchronized 中的代碼,notifyall只是讓處于wait的線程重新?lián)碛墟i的爭(zhēng)奪權(quán),但是只會(huì)有一個(gè)獲得鎖并執(zhí)行。
那么notify和notifyall在效果上又什么實(shí)質(zhì)區(qū)別呢?
主要的效果區(qū)別是notify用得不好容易導(dǎo)致死鎖,例如下面提到的例子。
public synchronized void put(Object o) {
while (buf.size()==MAX_SIZE) {
wait(); // called if the buffer is full (try/catch removed for brevity)
}
buf.add(o);
notify(); // called in case there are any getters or putters waiting
}
public synchronized Object get() {
// Y: this is where C2 tries to acquire the lock (i.e. at the beginning of the method)
while (buf.size()==0) {
wait(); // called if the buffer is empty (try/catch removed for brevity)
// X: this is where C1 tries to re-acquire the lock (see below)
}
Object o = buf.remove(0);
notify(); // called if there are any getters or putters waiting
return o;
}
所以除非你非常確定notify沒有問題,大部分情況還是是用notifyall。
更多詳細(xì)的介紹可以參看:
http://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again
- java 多線程Thread與runnable的區(qū)別
- java創(chuàng)建線程的兩種方法區(qū)別
- Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹實(shí)例詳解
- java 線程詳解及線程與進(jìn)程的區(qū)別
- java 線程中start方法與run方法的區(qū)別詳細(xì)介紹
- Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹
- java中thread線程start和run的區(qū)別
- java基本教程之Thread中start()和run()的區(qū)別 java多線程教程
- Java線程中sleep和wait的區(qū)別詳細(xì)介紹
- 詳解多線程及Runable 和Thread的區(qū)別
相關(guān)文章
詳解mybatis plus使用insert沒有返回主鍵的處理
這篇文章主要介紹了詳解mybatis plus使用insert沒有返回主鍵的處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring Boot部署到Tomcat過程中遇到的問題匯總
這篇文章主要給大家分享了關(guān)于Spring Boot部署到Tomcat過程中遇到的一些問題,文中將解決的方法介紹非常詳細(xì),對(duì)同樣遇到這個(gè)問題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11