一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java notify和notifyAll的區(qū)別和相同

Java notify和notifyAll的區(qū)別和相同

2020-06-15 12:02姚國(guó)俊 JAVA教程

本文主要介紹Java notify和notifyAll的知識(shí),這里整理詳細(xì)的資料來(lái)說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下

經(jīng)常在往上逛,關(guān)于在java中notify和notifyAll,經(jīng)常有人有以下的說法:

notify只會(huì)通知一個(gè)在等待的對(duì)象,而notifyAll會(huì)通知所有在等待的對(duì)象,并且所有對(duì)象都會(huì)繼續(xù)運(yùn)行

并且,好像都有例子可以證明。上面的說法,可以說對(duì),也可以說不對(duì)。究其原因,在于其中有一點(diǎn)很關(guān)鍵,官方的說法如下所示:

wait,notify,notifyAll:

此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。通過以下三種方法之一,線程可以成為此對(duì)象監(jiān)視器的所有者

通過執(zhí)行此對(duì)象的同步實(shí)例方法。
通過執(zhí)行在此對(duì)象上進(jìn)行同步的 synchronized 語(yǔ)句的正文。
對(duì)于 Class 類型的對(duì)象,可以通過執(zhí)行該類的同步靜態(tài)方法。 
 一次只能有一個(gè)線程擁有對(duì)象的監(jiān)視器。

以上說法,摘自javadoc。意思即,在調(diào)用中,必須持有對(duì)象監(jiān)視器(即鎖),我們可以理解為需要在synchronized方法內(nèi)運(yùn)行。那么由此話的隱含意思,即如果要繼續(xù)由同步塊包含的代碼塊,需要重新獲取鎖才可以。這句話,在javadoc中這樣描述:

wait

此方法導(dǎo)致當(dāng)前線程(稱之為 T)將其自身放置在對(duì)象的等待集中,然后放棄此對(duì)象上的所有同步要求。出于線程調(diào)度
目的,在發(fā)生以下四種情況之一前,線程 T 被禁用,且處于休眠狀態(tài):
其他某個(gè)線程調(diào)用此對(duì)象的 notify 方法,并且線程 T 碰巧被任選為被喚醒的線程。
其他某個(gè)線程調(diào)用此對(duì)象的 notifyAll 方法。
其他某個(gè)線程中斷線程 T。
大約已經(jīng)到達(dá)指定的實(shí)際時(shí)間。但是,如果 timeout 為零,則不考慮實(shí)際時(shí)間,在獲得通知前該線程將一直等待。
 然后,從對(duì)象的等待集中刪除線程 T,并重新進(jìn)行線程調(diào)度。然后,該線程以常規(guī)方式與其他線程競(jìng)爭(zhēng),以獲得在該對(duì)
象上同步的權(quán)利;一旦獲得對(duì)該對(duì)象的控制權(quán),該對(duì)象上的所有其同步聲明都將被恢復(fù)到以前的狀態(tài),這就是調(diào)用 wait
 方法時(shí)的情況。然后,線程 T 從 wait 方法的調(diào)用中返回。所以,從 wait 方法返回時(shí),該對(duì)象和線程 T 的同步狀態(tài)與調(diào)
用 wait 方法時(shí)的情況完全相同。

即必須重新進(jìn)行獲取鎖,這樣對(duì)于notifyAll來(lái)說,雖然所有的線程都被通知了。但是這些線程都會(huì)進(jìn)行競(jìng)爭(zhēng),且只會(huì)有一個(gè)線程成功獲取到鎖,在這個(gè)線程沒有執(zhí)行完畢之前,其他的線程就必須等待了(只是這里不需要再notifyAll通知了,因?yàn)橐呀?jīng)notifyAll了,只差獲取鎖了)有如下一個(gè)代碼,可以重現(xiàn)這個(gè)現(xiàn)象。

首先,定義一個(gè)可以運(yùn)行的線程類,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static final Object obj = new Object();
  static class R implements Runnable {
    int i;
 
    R(int i) {
      this.i = i;
    }
 
    public void run() {
      try {
        synchronized(obj) {
          System.out.println("線程-> " + i + " 等待中");
          obj.wait();
          System.out.println("線程-> " + i + " 在運(yùn)行了");
          Thread.sleep(30000);
        }
      } catch(Exception e) {
        e.printStackTrace();
      }
    }
  }

注意上面的run方法內(nèi)部,我們?cè)趙ait()之后,打印一句話,然后將當(dāng)前代碼,暫停30秒。關(guān)于sleep方法,是這樣描述的:
該線程不丟失任何監(jiān)視器的所屬權(quán)。
即仍然持有鎖。

然后,定義一個(gè)main方法來(lái)運(yùn)行這些線程,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
Thread[] rs = new Thread[10];
    for(int i = 0;i < 10;i++) {
      rs[i] = new Thread(new R(i));
    }
    for(Thread r : rs) {
      r.start();
    }
 
    Thread.sleep(5000);
    synchronized(obj) {
      obj.notifyAll();
    }

我們定義了10個(gè)線程,然后全部運(yùn)行之。因?yàn)橛衱ait,10個(gè)線程都會(huì)在打印出 “開始運(yùn)行”之后等待。然后main方法調(diào)用notifyAll。這里的輸出就會(huì)出現(xiàn)如下的輸出:

線程-> 0 等待中
線程->  4 等待中
線程->  5 等待中
線程->  3 等待中
線程->  2 等待中
線程->  1 等待中
線程->  6 等待中
線程->  7 等待中
線程->  8 等待中
線程->  9 等待中
線程->  9 在運(yùn)行了
...30秒之內(nèi),不會(huì)有其他輸出

在上面的輸出中,在wait之后,只有一個(gè)線程輸出了”在運(yùn)行了”語(yǔ)句,并且在一段時(shí)間內(nèi)(這里為30秒),不會(huì)有其他輸出。即表示,在當(dāng)前代碼持有鎖之間,其他線程是不會(huì)輸出的。

最后結(jié)論就是:被wait的線程,想要繼續(xù)運(yùn)行的話,它必須滿足2個(gè)條件:

由其他線程notify或notifyAll了,并且當(dāng)前線程被通知到了

經(jīng)過和其他線程進(jìn)行鎖競(jìng)爭(zhēng),成功獲取到鎖了2個(gè)條件,缺一不可。其實(shí)在實(shí)現(xiàn)層面,notify和notifyAll都達(dá)到相同的效果,會(huì)有一個(gè)線程繼續(xù)運(yùn)行。但notifyAll免去了,線程運(yùn)行完了通知其他線程的必要,因?yàn)橐呀?jīng)通知過了。什么時(shí)候用notify,什么時(shí)候使用notifyAll,這就得看實(shí)際的情況了。

以上就是對(duì)Java notify和NotifyAll的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料謝謝大家對(duì)本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日韩欧美在线一二三四 | 手机看片国产免费久久网 | 欧美日韩高清完整版在线观看免费 | 欧美高清在线不卡免费观看 | 欧美日韩国产成人精品 | 91污无限制破解安卓2021 | 1919gogo女厕盗摄| 我的好妈妈7中字在线观看韩国 | 亚洲欧美国产在线 | sss在线观看免费视频 | 美味情缘韩国在线观看视频 | 国产另类视频 | 777奇米影视一区二区三区 | 女女性恋爱视频入口 | 国产成人精品免费午夜 | 精品精品国产自在现拍 | 青草草在线 | 久久亚洲精品成人 | a看片| 色婷婷久 | 天天欲色成人综合网站 | 日韩欧美国产一区二区三区 | 成人影院在线观看视频 | 亚洲国产天堂综合一区 | 国产精品极品美女自在线 | 果冻传媒天美传媒在线小视频播放 | 朝鲜女人free性xxe | 欧美一级艳片视频免费观看 | 午夜欧美精品久久久久久久久 | 国产国语在线播放视频 | 动漫美女被吸乳 | 2021国产麻豆剧传媒剧情动漫 | 亚洲AV精品无码喷水直播间 | 天天色综合久久 | 亚洲冬月枫中文字幕在线看 | 日本不卡在线一区二区三区视频 | 香蕉91视频 | 麻豆视频免费在线观看 | 成人涩涩屋福利视频 | 女毛片 | 欧美三级不卡视频 |