Java鎖機制&wait方法&notify方法關(guān)系實例

前言

經(jīng)常看到有sleep和wait的區(qū)別弃理,大都千篇一律,都會談及到wait會釋放鎖屎蜓,并且本線程將會進入wait狀態(tài)痘昌,只有回調(diào)了notify或者notifyAll方法之后才能夠喚醒,才能夠繼續(xù)執(zhí)行炬转。那么這一個過程究竟說的是什么辆苔?這么抽象的描述,能否有一個例子呢扼劈?本文主要講的就是這個問題驻啤。

問題實例化

這里還是用最為常見的銀行賬戶作為實例。假設(shè)有兩個賬戶荐吵,A賬戶資金100骑冗,B賬戶資金200,那么如果需要A轉(zhuǎn)給B120元捍靠,那么肯定是不行的沐旨,但是資金轉(zhuǎn)賬,欠債總是要還的榨婆,所以不能就此罷休吧(如果你有錢例外)磁携,所以這個操作只能暫時掛起。接下來良风,B可能欠了A一些人情(暫且這么認為)谊迄,所以需要給A轉(zhuǎn)50塊錢,由于B有200元烟央,足夠了统诺,所以直接就轉(zhuǎn)了。這個時候A資金有了150疑俭,足夠轉(zhuǎn)給B120元了粮呢,所以前面掛起的操作需要繼續(xù)執(zhí)行。(上述只是一個例子,不要轉(zhuǎn)牛角尖啄寡,說什么B轉(zhuǎn)A 50豪硅,還不如直接讓A轉(zhuǎn)給B 70)

語言描述

上面已經(jīng)描述得很清楚了,這里主要是說明幾個關(guān)鍵點:
1)掛起挺物,我們這里是將當前線程通過wait方法操作的
2)將前面掛起的操作恢復懒浮,需要在當前線程(非1)線程)notify或notifyAll

源碼分析

package hudson;


public class MainWork {
    
    public static void main(String[] args) {
        account = new int[]{100,200};
        MainWork mainWork = new MainWork();
        //需要注意的是子線程必須在主線程之前回調(diào)
        //原因在于,我們的主線程在回調(diào)transfer方法時由于
        //轉(zhuǎn)錢者資金不足會導致主線程進入wait狀態(tài)识藤,需要等待
        //其他線程再次進入該對象拿到對象鎖砚著,并通過回調(diào)notify或者notifyAll
        //方法來喚醒主線程繼續(xù)執(zhí)行
        new Thread(){
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mainWork.transfer(1, 0, 10);
            };
        }.start();
        //由于賬戶0資金不足120,本方法回調(diào)會導致主線程進入wait狀態(tài)
        mainWork.transfer(0, 1, 120);
    }
    
    private static int[] account;
    public synchronized void transfer(int from,int to,int count){
        while(account[from]<count){
            try {
                System.out.println("對不起痴昧,資金不足稽穆,進入等待狀態(tài)");
                //進入等待,會釋放鎖剪个。需要外界再次回調(diào)本方法(拿到本對象鎖)秧骑,并
                //回調(diào)notify喚醒線程版确,以便查看是否資金是否充足
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("從"+from+"賬戶轉(zhuǎn)錢到"+to+"賬戶"+count+"元錢");
        account[from] -= count;
        account[to] += count;
        notifyAll();
    }

}

上述代碼非常簡單扣囊,但是需要有幾點注意:
1)子線程必須在主線程之前回調(diào),因為主線程完成的是A轉(zhuǎn)B的第一次操作绒疗,由于A太窮侵歇,沒法支付,所以會導致進入wait狀態(tài)吓蘑,即進入阻塞狀態(tài)惕虑。如果你把子線程放在后面,那么子線程是沒有機會執(zhí)行的
2)在wait外部是用一個while循環(huán)包裹的磨镶,為什么不能用if呢溃蔫?
原因是,如果使用if包裹琳猫,假設(shè)B轉(zhuǎn)給A的資金不足以使得A的資金超過120元伟叛,即不足以使得A后面有能夠還給B 120元,例如B轉(zhuǎn)給A 10元脐嫂,那么A資金是110元统刮,這個時候是不滿足A轉(zhuǎn)給B 120元的條件的,所以不應(yīng)該往后面執(zhí)行账千。啰嗦了這么一大堆侥蒙,簡單地說就是在被其他線程喚醒之后,我們還需要判斷條件是否符合繼續(xù)執(zhí)行

結(jié)果測試

視頻_2017-11-12_224942.gif

源代碼

https://github.com/HudsonAndroid/DataStructureAlgorithm/tree/master/java%E7%9F%A5%E8%AF%86/%E9%94%81%E6%9C%BA%E5%88%B6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匀奏,一起剝皮案震驚了整個濱河市鞭衩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖论衍,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恒水,死亡現(xiàn)場離奇詭異,居然都是意外死亡饲齐,警方通過查閱死者的電腦和手機钉凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捂人,“玉大人御雕,你說我怎么就攤上這事±拇睿” “怎么了酸纲?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瑟匆。 經(jīng)常有香客問我闽坡,道長,這世上最難降的妖魔是什么愁溜? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任疾嗅,我火速辦了婚禮,結(jié)果婚禮上冕象,老公的妹妹穿的比我還像新娘代承。我一直安慰自己,他們只是感情好渐扮,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布论悴。 她就那樣靜靜地躺著,像睡著了一般墓律。 火紅的嫁衣襯著肌膚如雪膀估。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天耻讽,我揣著相機與錄音察纯,去河邊找鬼。 笑死齐饮,一個胖子當著我的面吹牛捐寥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祖驱,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼握恳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捺僻?” 一聲冷哼從身側(cè)響起乡洼,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤崇裁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后束昵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔稳,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年锹雏,在試婚紗的時候發(fā)現(xiàn)自己被綠了巴比。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡礁遵,死狀恐怖轻绞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佣耐,我是刑警寧澤政勃,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站兼砖,受9級特大地震影響奸远,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讽挟,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一懒叛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏挡,春花似錦芍瑞、人聲如沸晨仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪己。三九已至妥凳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間答捕,已是汗流浹背逝钥。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拱镐,地道東北人艘款。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像沃琅,于是被迫代替她去往敵國和親哗咆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 相關(guān)概念 面向?qū)ο蟮娜齻€特征 封裝,繼承,多態(tài).這個應(yīng)該是人人皆知.有時候也會加上抽象. 多態(tài)的好處 允許不同類對...
    東經(jīng)315度閱讀 1,936評論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法益眉,類相關(guān)的語法晌柬,內(nèi)部類的語法姥份,繼承相關(guān)的語法,異常的語法年碘,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 873評論 0 1
  • 提鳥上場也中槍 到了11點澈歉,桃花一朵果然下線了,潘笑笑能夠猜出他在下線的最后一秒還在打字與她聊天屿衅,因為他有半句...
    亂世長安閱讀 272評論 0 1
  • 器皿加水果埃难,所謂“一器一果”也! 蘋果6plus拍攝涤久,MIX后期
    花落寂寂hjr閱讀 415評論 0 2