激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 聊聊Object類中的wait()和notify()方法

聊聊Object類中的wait()和notify()方法

2022-01-20 00:56百了江 Java教程

這篇文章主要介紹了Object類中的wait()和notify()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Object類中的wait()和notify()方法

一、特點

wait()和notify()方法并不是線程對象的方法,是Java中任何一個Java對象都有的方法,并不特殊。

二、wait()方法的作用

Object obj = new Object();
obj.wait();

表示:obj.wait();方法的調用,會讓“當前線程(正在obj對象上活動的線程)”進入等待狀態。

三、notify()方法的作用

Object obj = new Object();
obj.notify();

表示:喚醒正在obj對象上等待的線程。

補充:

Object obj = new Object();
obj.notifyAll();

表示:喚醒正在obj對象上等待的所有線程。

四、wait()和notify()的使用

wait()和notify()方法都是建立在synchronized線程同步的基礎之上

重點

obj.wait()方法會讓正在obj對象上活動的當前線程進入等待狀態,并且釋放之前占有的obj對象的鎖。

obj.notify()方法只會通知,不會釋放之前占有的obj對象的鎖。

 

object中的wait和notify細節

wait

jdk源碼:

聊聊Object類中的wait()和notify()方法

重點看下劃線的地方,是不是有些不理解。有個印象我們繼續往下看。

public class resourse {
  private Integer number = 0 ;
  /**
   * 用if為啥不行
   * 1:首先一點我們要搞清楚 wait操作會釋放鎖
   * 2:想想這種情況,當一個生產者線程執行的時候 if number!=0 (此時的number為1 ) 就會發生阻塞 這時候
   * 釋放出鎖 這時候又一個生產者進程進來又會被wait住.然后一個生產者進程進來,消費了一個 但是notifyall 將所有的進程
   * 都解開了 。。那兩個生產者進程就會直接運行if后面的東西并沒有被拉回來重新判斷一下。這樣就造成了number的值變成2.同理number
   * 變成負數也是有可能的(兩個消費者進程先進來都堵塞).
   *
   *
   *
   *
   * @throws Exception
   */
  public synchronized void  produce () throws Exception
  {
//        判斷  這里用while 用if多與兩個線程容易出錯
//        不等于0就要等待消費者消費完
       if(number!=0)
       {
           this.wait();
       }
//         干活
      number++;
      System.out.println(Thread.currentThread().getName() + "的資源數為:" + number.toString());
//        釋放
      this.notifyAll();
  }
//wait操作會釋放鎖
  public synchronized void consumer () throws Exception
  {
      //    等于零就要等待生產者生產
      if (number == 0)
      {
          this.wait();
      }
//        消費
      number--;
      System.out.println(Thread.currentThread().getName() + "的資源數為:" + number.toString());
//        釋放
      this.notifyAll();
  }
}

調用者。這里開啟了兩個生產者和兩個消費者線程。生產者線程都執行100次的produce,消費者線程都執行100次的consumer

public class main {
  public static void main (String[] args) {
      resourse resourse = new resourse();
          new Thread(()->{
              try{
                  for (int i=0 ; i<100;i++)
                  resourse.produce();
              }catch (Exception e)
              {
                  e.printStackTrace();
              }
          }).start();
      new Thread(()->{
          try{
              for (int i=0 ; i<100;i++)
              resourse.produce();
          }catch (Exception e)
          {
              e.printStackTrace();
          }
      }).start();
      new Thread(()->{
          try{
              for (int i=0 ; i<100;i++)
                  resourse.consumer();
          }catch (Exception e)
          {
              e.printStackTrace();
          }
      }).start();
      new Thread(()->{
          try{
              for (int i=0 ; i<100;i++)
              resourse.consumer();
          }catch (Exception e)
          {
              e.printStackTrace();
          }
      }).start();
  }
}

我要說的重點是:

聊聊Object類中的wait()和notify()方法

這樣設計真的合理嗎?

jdk中為啥要規定我們要使用while,而不是if?

用if為啥不行

1:首先一點我們要搞清楚 wait操作會釋放鎖

2:想想這種情況,當一個生產者線程執行的時候 if number!=0 (此時的number為1 ) 就會發生阻塞 這時候釋放出鎖 這時候又一個生產者進程進來又會被wait住.然后一個生產者進程進來,消費了一個 但是notifyall 將所有的進程都解開了 。。那兩個生產者進程就會直接運行if后面的東西并沒有被拉回來重新判斷一下。這樣就造成了number的值變成2.同理number變成負數也是有可能的(兩個消費者進程先進來都堵塞).

這個問題絕對是干貨,在工作中絕對會遇到生產者消費者問題,不少程序員會在這個地方踩坑。面試的時候如果考到你這個地方,你能解答出深層原理來。相信面試官會高看你一眼。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_44705164/article/details/112758403

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 久久99综合久久爱伊人 | 91短视频版高清在线观看www | 免费网址黄 | 一区二区三区四区国产 | 色猫av| 久久久久免费精品国产小说色大师 | 欧美性生活区 | 麻豆蜜桃在线观看 | 精国产品一区二区三区四季综 | 欧美日韩一区三区 | 欧美一区二区三区四区夜夜大片 | 天天舔夜夜操 | 91精品国产一区二区三区动漫 | 夜班护士在线观看 | 成人黄色网战 | 欧美一级无毛 | 羞羞的视频 | av在线播放免费观看 | 亚洲国产精品一区二区久久 | 双性帝王调教跪撅打屁股 | japanese xxxxhd| 逼特逼视频在线观看 | 午夜精品久久久久久中宇 | 国产jjizz一区二区三区视频 | 神马福利网 | 手机黄网www8xcn | 亚洲第一成网站 | 精品xxxx户外露出视频 | 12av电影 | 久久久久一本一区二区青青蜜月 | 欧美性猛交xxx乱大交3蜜桃 | 亚洲欧美一区二区三区在线观看 | 日韩美香港a一级毛片 | 国人精品视频在线观看 | 精品一区二区视频在线观看 | 国产精品久久久久久久久久东京 | 黄色网址进入 | 双性精h调教灌尿打屁股的文案 | 久久精品视频一区 | 亚洲精品永久视频 | 国产成人精品二区 |