基于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è)線程可以獲得鎖,也就是說(shuō)只有一個(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沒(méi)有問(wèn)題,大部分情況還是是用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沒(méi)有返回主鍵的處理
這篇文章主要介紹了詳解mybatis plus使用insert沒(méi)有返回主鍵的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring Boot部署到Tomcat過(guò)程中遇到的問(wèn)題匯總
這篇文章主要給大家分享了關(guān)于Spring Boot部署到Tomcat過(guò)程中遇到的一些問(wèn)題,文中將解決的方法介紹非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)評(píng)論回復(fù)功能的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07java實(shí)現(xiàn)簡(jiǎn)單的爬蟲(chóng)之今日頭條
最近在學(xué)習(xí)搜索方面的東西,需要了解網(wǎng)絡(luò)爬蟲(chóng)方面的知識(shí),雖然有很多開(kāi)源的強(qiáng)大的爬蟲(chóng),但本著學(xué)習(xí)的態(tài)度,想到之前在做資訊站的時(shí)候需要用到爬蟲(chóng)來(lái)獲取一些文章,今天剛好有空就研究了一下.在網(wǎng)上看到了一個(gè)demo,使用的是Jsoup,我拿過(guò)來(lái)修改了一下,有需要的朋友可以參考2016-11-11