最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年09月12日 10:55:47   作者:姚國俊  
本文主要介紹Java notify和notifyAll的知識,這里整理詳細的資料來說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下

經常在往上逛,關于在java中notify和notifyAll,經常有人有以下的說法:

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

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

wait,notify,notifyAll:

此方法只應由作為此對象監(jiān)視器的所有者的線程來調用。通過以下三種方法之一,線程可以成為此對象監(jiān)視器的所有者

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

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

wait

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

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

首先,定義一個可以運行的線程類,如下所示:

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 + " 在運行了");
          Thread.sleep(30000);
        }
      } catch(Exception e) {
        e.printStackTrace();
      }
    }
  }

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

然后,定義一個main方法來運行這些線程,如下所示:

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個線程,然后全部運行之。因為有wait,10個線程都會在打印出 “開始運行”之后等待。然后main方法調用notifyAll。這里的輸出就會出現(xiàn)如下的輸出:

線程-> 0 等待中
線程->  4 等待中
線程->  5 等待中
線程->  3 等待中
線程->  2 等待中
線程->  1 等待中
線程->  6 等待中
線程->  7 等待中
線程->  8 等待中
線程->  9 等待中
線程->  9 在運行了
...30秒之內,不會有其他輸出

在上面的輸出中,在wait之后,只有一個線程輸出了”在運行了”語句,并且在一段時間內(這里為30秒),不會有其他輸出。即表示,在當前代碼持有鎖之間,其他線程是不會輸出的。

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

由其他線程notify或notifyAll了,并且當前線程被通知到了

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

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

相關文章

  • list集合去除重復對象的實現(xiàn)

    list集合去除重復對象的實現(xiàn)

    下面小編就為大家?guī)硪黄猯ist集合去除重復對象的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java中三種簡單注解介紹和代碼實例

    Java中三種簡單注解介紹和代碼實例

    這篇文章主要介紹了Java中三種簡單注解介紹和代碼實例,本文講解了Override注解、Deprecated注解、Suppresswarnings注解、元注解等內容,需要的朋友可以參考下
    2014-09-09
  • java數(shù)組元素的引用實例講解

    java數(shù)組元素的引用實例講解

    在本篇文章里小編給大家整理的是一篇關于java數(shù)組元素的引用實例講解內容,有需要的朋友們可以學習參考下。
    2021-03-03
  • 支付寶開發(fā)平臺之第三方授權登錄與獲取用戶信息

    支付寶開發(fā)平臺之第三方授權登錄與獲取用戶信息

    本文主要介紹了第三方授權登錄與獲取用戶信息的實例方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Java編程ssh整合常見錯誤解析

    Java編程ssh整合常見錯誤解析

    這篇文章主要介紹了Java編程ssh整合常見錯誤解析,如果有什么不足之處,歡迎留言補充。
    2017-10-10
  • java之左旋轉字符串介紹

    java之左旋轉字符串介紹

    java之左旋轉字符串介紹,需要的朋友可以參考一下
    2013-02-02
  • java通過poi解析word入門的操作方法

    java通過poi解析word入門的操作方法

    Apache POI 是一個處理Miscrosoft Office各種文件格式的開源項目,可以使用POI在Java程序中對Miscrosoft Office各種文件進行讀寫操作,本文給大家介紹java通過poi解析word入門的操作方法,感興趣的朋友一起看看吧
    2024-08-08
  • Java SpringMVC數(shù)據響應超詳細講解

    Java SpringMVC數(shù)據響應超詳細講解

    Spring?MVC?是?Spring?提供的一個基于?MVC?設計模式的輕量級?Web?開發(fā)框架,本質上相當于?Servlet,Spring?MVC?角色劃分清晰,分工明細,本章來講解SpringMVC數(shù)據響應
    2022-04-04
  • 線程池ThreadPoolExecutor并行處理實現(xiàn)代碼

    線程池ThreadPoolExecutor并行處理實現(xiàn)代碼

    這篇文章主要介紹了線程池ThreadPoolExecutor并行處理實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Maven重復依賴問題解決(同一個jar多個版本)

    Maven重復依賴問題解決(同一個jar多個版本)

    本文主要介紹了Maven重復依賴問題解決(同一個jar多個版本),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

吉安市| 石家庄市| 珲春市| 体育| 武义县| 潼关县| 清水河县| 德令哈市| 元谋县| 九江市| 拉萨市| 潼关县| 九龙坡区| 涪陵区| 朝阳市| 吐鲁番市| 涞水县| 正安县| 宣汉县| 西吉县| 中西区| 永寿县| 沁阳市| 永川市| 潞城市| 玛曲县| 遂川县| 广水市| 宁武县| 土默特左旗| 浦北县| 新竹市| 汉阴县| 保山市| 满洲里市| 丰城市| 大余县| 北碚区| 北川| 东港市| 来安县|