国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java中notify()和notifyAll()的使用區(qū)別

瀏覽:44日期:2022-08-09 18:16:03

notify() 和 notifyAll() 有什么區(qū)別?

先解釋兩個概念。 等待池:假設(shè)一個線程A調(diào)用了某個對象的wait()方法,線程A就會釋放該對象的鎖后,進(jìn)入到了該對象的等待池,等待池中的線程不會去競爭該對象的鎖。 鎖池:只有獲取了對象的鎖,線程才能執(zhí)行對象的 synchronized 代碼,對象的鎖每次只有一個線程可以獲得,其他線程只能在鎖池中等待然后再來說notify和notifyAll的區(qū)別 如果線程調(diào)用了對象的 wait()方法,那么線程便會處于該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。 當(dāng)有線程調(diào)用了對象的 notifyAll()方法(喚醒所有 wait 線程)或 notify()方法(只隨機(jī)喚醒一個 wait 線程),被喚醒的的線程便會進(jìn)入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。也就是說,調(diào)用了notify后只要一個線程會由等待池進(jìn)入鎖池,而notifyAll會將該對象等待池內(nèi)的所有線程移動到鎖池中,等待鎖競爭 優(yōu)先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調(diào)用 wait()方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼續(xù)往下執(zhí)行,直到執(zhí)行完了 synchronized 代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續(xù)競爭該對象鎖。

綜上,所謂喚醒線程,另一種解釋可以說是將線程由等待池移動到鎖池,notifyAll調(diào)用后,會將全部線程由等待池移到鎖池,然后參與鎖的競爭,競爭成功則繼續(xù)執(zhí)行,如果不成功則留在鎖池等待鎖被釋放后再次參與競爭。而notify只會喚醒一個線程。

有了這些理論基礎(chǔ),后面的notify可能會導(dǎo)致死鎖,而notifyAll則不會的例子也就好解釋了

測試代碼

public class TestNotifyNotifyAll { private static Object obj = new Object(); public static void main(String[] args) { //測試 RunnableImplA wait() Thread t1 = new Thread(new RunnableImplA(obj)); Thread t2 = new Thread(new RunnableImplA(obj)); t1.start(); t2.start(); //RunnableImplB notify() Thread t3 = new Thread(new RunnableImplB(obj)); t3.start(); // //RunnableImplC notifyAll()// Thread t4 = new Thread(new RunnableImplC(obj));// t4.start(); } } class RunnableImplA implements Runnable { private Object obj; public RunnableImplA(Object obj) { this.obj = obj; } public void run() { System.out.println('run on RunnableImplA'); synchronized (obj) { System.out.println('obj to wait on RunnableImplA'); try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('obj continue to run on RunnableImplA'); } }} class RunnableImplB implements Runnable { private Object obj; public RunnableImplB(Object obj) { this.obj = obj; } public void run() { System.out.println('run on RunnableImplB'); System.out.println('睡眠3秒...'); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (obj) { System.out.println('notify obj on RunnableImplB'); obj.notify(); } }} class RunnableImplC implements Runnable { private Object obj; public RunnableImplC(Object obj) { this.obj = obj; } public void run() { System.out.println('run on RunnableImplC'); System.out.println('睡眠3秒...'); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (obj) { System.out.println('notifyAll obj on RunnableImplC'); obj.notifyAll(); } }}

結(jié)果:僅調(diào)用一次 obj.notify(),線程 t1 或 t2 中的一個始終在等待被喚醒,程序不終止

run on RunnableImplAobj to wait on RunnableImplArun on RunnableImplAobj to wait on RunnableImplArun on RunnableImplB睡眠3秒...notify obj on RunnableImplBobj continue to run on RunnableImplA

把 t3 注掉,啟動 t4 線程。調(diào)用 obj.notifyAll() 方法

public class TestNotifyNotifyAll { private static Object obj = new Object(); public static void main(String[] args) { //測試 RunnableImplA wait() Thread t1 = new Thread(new RunnableImplA(obj)); Thread t2 = new Thread(new RunnableImplA(obj)); t1.start(); t2.start(); // //RunnableImplB notify()// Thread t3 = new Thread(new RunnableImplB(obj));// t3.start(); //RunnableImplC notifyAll() Thread t4 = new Thread(new RunnableImplC(obj)); t4.start(); } }

結(jié)果:t1、t2線程均可以執(zhí)行完畢

run on RunnableImplAobj to wait on RunnableImplArun on RunnableImplAobj to wait on RunnableImplArun on RunnableImplC睡眠3秒...notifyAll obj on RunnableImplCobj continue to run on RunnableImplAobj continue to run on RunnableImplA

到此這篇關(guān)于Java中notify()和notifyAll()的使用區(qū)別的文章就介紹到這了,更多相關(guān)Java notify()和notifyAll()內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 草草影院私人免费入口 | 99精品免费观看 | 国产永久免费高清动作片www | 午夜在线亚洲男人午在线 | 国产精品午夜性视频网站 | 精品国产免费一区二区三区 | 欧美久久亚洲精品 | 黄网站在线播放视频免费观看 | 在线视频 日韩 | 日韩精品福利视频一区二区三区 | 国产欧美一区二区三区免费 | 免费又黄又爽视频 | 99热久久国产精品一区 | 国产成人做受免费视频 | 在线高清国产 | 国产精品9 | 黄影院| 国产精品久久久久精 | 精品亚洲永久免费精品 | 精品国产呦系列在线看 | 国产免费视屏 | a性片| 亚洲视频中文字幕在线 | 66精品| 亚洲va在线va天堂va四虎 | 欧美日韩高清观看一区二区 | 亚洲精品午夜在线观看 | 国产精品久久久久久爽爽爽 | 国产精品国产三级国产专 | 日本九六视频 | 亚洲日本在线观看视频 | 国产97公开成人免费视频 | 激情丝袜美女视频二区 | 69精品免费视频 | 特级淫片欧美高清视频蜜桃 | 欧美成人免费全网站大片 | 18视频免费网址在线观看 | 久久国产欧美另类久久久 | 日韩成人小视频 | 久久久久日韩精品无 | 国产欧美日韩不卡在线播放在线 |