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

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

 更新時間:2021年09月27日 10:26:17   作者:百了江  
這篇文章主要介紹了Object類中的wait()和notify()方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

一、特點(diǎn)

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

二、wait()方法的作用

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

表示:obj.wait();方法的調(diào)用,會讓“當(dāng)前線程(正在obj對象上活動的線程)”進(jìn)入等待狀態(tài)。

三、notify()方法的作用

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

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

補(bǔ)充:

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

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

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

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

重點(diǎn)

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

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

object中的wait和notify細(xì)節(jié)

wait

jdk源碼:

在這里插入圖片描述

重點(diǎn)看下劃線的地方,是不是有些不理解。有個印象我們繼續(xù)往下看。

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

調(diào)用者。這里開啟了兩個生產(chǎn)者和兩個消費(fèi)者線程。生產(chǎn)者線程都執(zhí)行100次的produce,消費(fèi)者線程都執(zhí)行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();
    }
}

我要說的重點(diǎn)是:

在這里插入圖片描述

這樣設(shè)計真的合理嗎?

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

用if為啥不行

1:首先一點(diǎn)我們要搞清楚 wait操作會釋放鎖

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析Java線程同步鎖的選擇方法

    解析Java線程同步鎖的選擇方法

    本篇文章是對Java線程同步鎖的選擇方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用Spring AOP監(jiān)控指定方法執(zhí)行時間的代碼詳解

    使用Spring AOP監(jiān)控指定方法執(zhí)行時間的代碼詳解

    這篇文章主要介紹了使用Spring AOP監(jiān)控指定方法執(zhí)行時間,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Java設(shè)計模式中橋接模式應(yīng)用詳解

    Java設(shè)計模式中橋接模式應(yīng)用詳解

    橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-11-11
  • mybatis中foreach嵌套if標(biāo)簽方式

    mybatis中foreach嵌套if標(biāo)簽方式

    這篇文章主要介紹了mybatis中foreach嵌套if標(biāo)簽方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中的arrays.sort()代碼詳解

    java中的arrays.sort()代碼詳解

    這篇文章主要介紹了Java中的Arrays.sort()代碼詳解,涉及Arrays.sort()簡單示例,策略模式,”super”的使用等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu)

    詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu)

    這篇文章主要介紹了詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java實現(xiàn)的讀取資源文件工具類ResourcesUtil實例【可動態(tài)更改值的內(nèi)容】

    Java實現(xiàn)的讀取資源文件工具類ResourcesUtil實例【可動態(tài)更改值的內(nèi)容】

    這篇文章主要介紹了Java實現(xiàn)的讀取資源文件工具類ResourcesUtil,結(jié)合實例形式分析了java針對資源文件的讀取與修改相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Spring Boot基礎(chǔ)入門之基于注解的Mybatis

    Spring Boot基礎(chǔ)入門之基于注解的Mybatis

    這篇文章主要給大家介紹了關(guān)于Spring Boot基礎(chǔ)入門之基于注解的Mybatis的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 淺談Java并發(fā) J.U.C之AQS:CLH同步隊列

    淺談Java并發(fā) J.U.C之AQS:CLH同步隊列

    AQS內(nèi)部維護(hù)著一個FIFO隊列,該隊列就是CLH同步隊列。下面小編來簡單介紹下這個隊列
    2019-05-05
  • sublime編譯器怎么運(yùn)行java程序

    sublime編譯器怎么運(yùn)行java程序

    Sublime是一款強(qiáng)大的代碼編輯器,它提供了豐富的功能和插件,可以幫助開發(fā)者提高代碼的編寫效率和質(zhì)量,通過安裝相關(guān)插件和進(jìn)行簡單配置,我們可以輕松地在Sublime中編譯和運(yùn)行Java代碼,下面我們將詳細(xì)介紹如何配置Sublime,使其能夠高效地運(yùn)行Java代碼
    2024-06-06

最新評論

凤山县| 元朗区| 民丰县| 青州市| 嘉黎县| 武定县| 沁水县| 马鞍山市| 鄄城县| 吴桥县| 噶尔县| 凤庆县| 铁力市| 比如县| 西盟| 岗巴县| 文登市| 外汇| 九龙城区| 塔河县| 夏邑县| 东宁县| 浦江县| 泰宁县| 西乡县| 定远县| 海南省| 东山县| 襄樊市| 巴中市| 南城县| 杂多县| 黑山县| 石台县| 惠州市| 府谷县| 炎陵县| 常宁市| 苏尼特左旗| 绥滨县| 怀安县|