日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)

發(fā)布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 educoder 使用线程锁(lock)实现线程同步_线程间的通信(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章主要從4個角度來講多線程間的通信:

  • 使用wait/notify實現(xiàn)線程間的通信
  • 生產(chǎn)者/消費者模式的實現(xiàn)
  • 方法join的使用
  • ThreadLocal類的使用
  • 等待/通知機(jī)制的實現(xiàn):

    (1)wait()方法屬于Object類,作用是讓當(dāng)前執(zhí)行代碼的線程進(jìn)行等待,該方法用來將當(dāng)前線程置于"預(yù)執(zhí)行隊列"中,并且在wait()所在的代碼行處停止執(zhí)行,直到接到通知或者被中斷為止。在調(diào)用wait()方法之前,線程必須獲得該對象的對象級別鎖,只能在同步方法或者同步塊中調(diào)用wait()方法。在執(zhí)行wait()方法后,當(dāng)前線程釋放鎖。在從wait()返回前,線程與其他線程競爭重新獲得鎖。如果調(diào)用wait()時沒有持有適當(dāng)?shù)逆i,就會拋出IllegalMonitorStateException異常,它是RuntimeException的一個子類。因此不需要進(jìn)行異常捕獲。

    此處有個面試題,是關(guān)于為什么wait()方法必須在同步中?占小狼的公眾號給出了答案,lost wake up問題,作者給出了生產(chǎn)和消費的模式距離來說明lost wake up問題,并給出要解決就必須同步,獲取同一對象鎖,連接如下:

    阿里面試題,為什么wait()方法要放在同步塊中??mp.weixin.qq.com

    (2)notify()方法也需要在同步方法或者同步代碼塊中調(diào)用,在調(diào)用前,線程必須獲得該對象級別的鎖,如果調(diào)用notify()時沒有持有適當(dāng)?shù)逆i,就會拋出IllegalMonitorStateException異常。該方法用來通知那些可能等待對象的對象鎖的其他線程,如果有多個線程等待,則由線程規(guī)劃器隨機(jī)挑選其中一個呈wait狀態(tài)的線程,對其發(fā)出notify,并使它等待獲取該對象的對象鎖。需要說明的是,在執(zhí)行notify()方法后,當(dāng)前線程不會馬上釋放鎖,呈wait狀態(tài)的線程也不會馬上獲得鎖,必須等到notify()方法的線程執(zhí)行完,走出同步代碼塊或則方法的時候,當(dāng)前線程才會釋放鎖,wait狀態(tài)的線程才可以獲得鎖。

    notify()方法可以隨機(jī)喚醒等待隊列中等待同一共享資源的一個線程,并使線程退出等待隊列,進(jìn)入可運行的狀態(tài),該方法一次只可以喚醒一個線程。

    notifyAll()方法是可以喚醒所有正在等待隊列中等待同一共享資源的全部線程,讓其從等待狀態(tài)退出,進(jìn)入可運行狀態(tài),誰的優(yōu)先級高,誰將會先被執(zhí)行,也有可能隨機(jī)執(zhí)行,取決于JVM虛擬機(jī)的實現(xiàn)。

    下面這段代碼,因為沒有“對象監(jiān)視器”,沒有同步鎖的原因,所以出現(xiàn)了異常

    package

    異常:

    Exception

    下面這段代碼,雖然使用了synchronized關(guān)鍵字,而且wait方法也在同步塊中,但是因為當(dāng)前線程main被掛起,一直處于等待,所以wait()方法后面的代碼都沒有執(zhí)行機(jī)會。

    package

    運行結(jié)果:

    sync

    下面這段代碼實現(xiàn)了線程間的通信,線程A先啟動執(zhí)行,然后調(diào)用wait方法,線程睡眠3秒,然后線程B啟動執(zhí)行,并執(zhí)行了notify()方法,通知喚醒wait()的線程,當(dāng)線程B執(zhí)行完synchronized同步代碼塊,然后釋放了對象鎖,wait()的線程獲取到了對象鎖,然后繼續(xù)執(zhí)行。

    package

    運行結(jié)果:

    begin

    下面這段代碼,是當(dāng)list中添加元素5個的時候,然后就notify()另外一個wait()的線程。

    package

    運行結(jié)果:

    wait

    從運行結(jié)果可以看出,最開始是wait begin,結(jié)束是wait end。

    線程的生命周期:

    大致分為創(chuàng)建、可運行、運行、阻塞、銷毀等五個狀態(tài)。

    其中可運行狀態(tài)和運行狀態(tài)可以相互轉(zhuǎn)換,阻塞狀態(tài)和可運行狀態(tài)可以相互轉(zhuǎn)換。

    線程進(jìn)入Runnable狀態(tài)的情況:

    (1)調(diào)用sleep()方法后經(jīng)過的時間超過了指定的休眠時間

    (2)線程調(diào)用的阻塞IO已經(jīng)返回,阻塞方法執(zhí)行完畢

    (3)線程成功得獲得了試圖同步的監(jiān)視器

    (4)線程正在等待某個通知,其他線程發(fā)出了通知

    (5)處于掛起狀態(tài)的線程調(diào)用了resume方法恢復(fù)線程

    線程出現(xiàn)阻塞狀態(tài)的情況:

    (1)線程調(diào)用sleep方法,主動放棄占用的處理器資源

    (2)線程調(diào)用了阻塞式IO方法,在方法返回前,該線程被阻塞

    (3)線程試圖獲得一個同步監(jiān)視器,但是該同步監(jiān)視器正被其他線程所持有

    (4)線程等待某個通知

    (5)程序調(diào)用了suspend()方法,掛起該線程,此方法容易導(dǎo)致死鎖,應(yīng)該避免調(diào)用。

    wait方法執(zhí)行后,鎖會自動釋放;notify()方法執(zhí)行后,鎖不會自動釋放,除非執(zhí)行完對應(yīng)的synchronized方法,才會釋放鎖;sleep方法也是不釋放鎖的(????sleep方法不是指定線程休眠時間,休眠時間過后,線程就i 重新獲得CPU,去執(zhí)行嗎????我的理解:多線程情況下,其中一個線程在同步塊中被指定休眠時間,這個線程是在休眠期間不會釋放鎖,在休眠結(jié)束,同步塊執(zhí)行完以后就會釋放對象鎖)。

    執(zhí)行完同步代碼塊會釋放對象鎖;

    在執(zhí)行同步代碼塊的過程中,如果遇到異常導(dǎo)致線程終止,鎖也會被釋放;

    在執(zhí)行同步代碼塊的過程中,執(zhí)行了鎖所屬對象的wait()方法,這個線程會釋放對象鎖,而此線程對象會進(jìn)入線程等待池中,等待被喚醒。

    wait(long)方法:等待某一時間內(nèi)是否有線程對鎖進(jìn)行喚醒,如果超過這個時間則自動喚醒。

    下面代碼使用wait,分別有兩個線程執(zhí)行,都執(zhí)行了同步方法,從控制臺可以看出,程序依然沒有執(zhí)行完,正是因為A線程執(zhí)行了wait()方法后,釋放了對象鎖,B線程才可以獲取對象鎖,然后執(zhí)行同步代碼塊,執(zhí)行wait。

    package

    運行結(jié)果:

    begin

    下面的程序中使用了wait和notify結(jié)合,其中wait執(zhí)行完,其他線程還可以繼續(xù)執(zhí)行同步代碼塊,但是執(zhí)行到notify的時候,程序就一直不能結(jié)束,原因是notify()方法指定完后沒有釋放對象鎖,所以才導(dǎo)致這個問題發(fā)生,代碼和運行結(jié)果如下所示:

    package begin

    當(dāng)interrupt()方法和wait()方法相遇,下面是示例代碼和運行結(jié)果:

    package begin

    下面這段代碼是關(guān)于notify()方法,一次只可以喚醒一個線程(隨機(jī))的驗證:

    package

    程序運行結(jié)果:

    begin

    多線程中的生產(chǎn)者和消費者模式:

    (1)一個生產(chǎn)者和一個消費者:操作值

    package

    運行結(jié)果:set和get交替執(zhí)行

    set

    (2)多生產(chǎn)者與多消費者:操作值:假死

    下面的這段代碼,因為存在使用notify(),可能生產(chǎn)喚醒生產(chǎn)者,消費者喚醒消費者,所以會造成假死狀態(tài)。

    package

    運行結(jié)果:

    productor

    總結(jié)

    以上是生活随笔為你收集整理的educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精品国产精品国自产在线 | 韩国三级久久 | av中文天堂| 国产视频一级 | 国产av不卡一区 | 国产一级视频在线播放 | 国产区第一页 | 成人h动漫精品一区二区器材 | 久久久青青 | 中文字幕自拍偷拍 | 欧美福利一区 | 97色资源| 极品新婚夜少妇真紧 | 欧美日韩人妻精品一区二区 | 日本黄在线| 欧美性受xxxx黑人猛交88 | 精品亚洲国产成av人片传媒 | 美女洗澡无遮挡 | 黄色免费网站在线看 | 亚洲一区二区小说 | 全黄一级播放 | 欧美日韩不卡在线 | 人人人爽 | 国产美女毛片 | 色综合图区 | 欧美日韩亚洲在线 | 黄视频在线免费看 | 二级黄色录像 | 黄瓜视频色 | 欧美色老头| 办公室摸腿吻胸激情视频 | 韩日av| 久久久av片| 色人阁五月 | 色一五月 | 久草电影网站 | 国产精品自拍第一页 | 多啪啪免费视频 | 日本不卡在线 | 欧美韩国一区 | 韩国黄色av| 久久久久久久国产视频 | 一区二区三区日韩在线 | 91在线免费看 | 亚洲激情在线视频 | 黄色av大片 | xx久久 | 奇米第四色7777 | 一区二区在线免费观看 | 欧美sese | 日日草夜夜草 | 亚洲图片视频小说 | 成人激情视频在线播放 | 成人交配视频 | 一级黄色性生活片 | 久久成人小视频 | 国产精品一区二区网站 | 97在线精品| 亚洲在线 | 少妇高潮淫片免费观看 | 午夜精品视频一区 | 特种兵之深入敌后高清全集免费观看 | av大片在线看 | 密臀av| 国产麻豆精品久久一二三 | a级片一区二区 | 91极品身材尤物theporn | 成人黄色片免费看 | 天天爽天天射 | 精品少妇白浆小泬60P | 一区二区三区四区在线 | 色黄啪啪网 | 中文字幕二区三区 | 久草免费福利 | 欧美久久久久久 | 国产免费久久久 | 国产成人无码精品久久久久久 | 精品资源成人 | 玖玖爱av| 久久国产日韩 | 日本一区二区欧美 | av一区在线播放 | 国产激情对白 | 国产一区二区三区色淫影院 | 欧美在线一级视频 | 国产操比视频 | 国产精品久久久久久久久 | 亚洲欧美视频一区二区 | 青青操免费在线视频 | 日本乱码一区二区 | 美女日日日 | www.777奇米影视 | 国产欧美在线一区 | 日韩1页 | 亚洲一区观看 | 成人www视频 | 99热精品在线播放 | 四虎在线观看视频 | 婷婷六月综合 |