国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中sleep和wait有什么區別?

2019-11-06 07:11:32
字體:
來源:轉載
供稿:網友

sleep和wait有什么區別?大家都說是sleep不會釋放鎖,wait會釋放鎖。一直都不是很理解。最近在看AQS代碼,才找到一些蛛絲馬跡。AQS的await和wait實現思想類似,釋放當前占有的鎖,讓其他線程繼續獲取鎖。等適合機會喚醒后再重新占有鎖。

await方法有fullyRelease的方法 1.先將線程插入等待隊列; 2.釋放當前的占有的資源,即釋放鎖; 3.讓當前線程停止,等待喚醒; 4.喚醒后繼續爭搶鎖。

public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); int savedState = fullyRelease(node); int interruptMode = 0; while (!isOnSyncQueue(node)) { LockSupport.park(this); if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; if (node.nextWaiter != null) // clean up if cancelled unlinkCancelledWaiters(); if (interruptMode != 0) reportInterruptAfterWait(interruptMode); }

fullyRelease先保存當前資源,然后釋放資源。等待適合時機再恢復當前的狀態。

final int fullyRelease(Node node) { boolean failed = true; try { int savedState = getState(); if (release(savedState)) { failed = false; return savedState; } else { throw new IllegalMonitorStateException(); } } finally { if (failed) node.waitStatus = Node.CANCELLED; } }

跟進去release方法看看,執行tryRelease,然后unparkSuccessor,就是喚醒后繼線程。因此await會釋放其占有的資源,換句話說就是釋放其占有的鎖。讓其他線程有機會獲取鎖。

public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香港| 凯里市| 墨竹工卡县| 绥阳县| 衡阳县| 绥阳县| 彝良县| 闵行区| 南召县| 拉孜县| 太谷县| 嘉定区| 汉阴县| 乳源| 岫岩| 陆良县| 渝中区| 左权县| 北流市| 吉林市| 大新县| 新野县| 马边| 胶州市| 泸西县| 格尔木市| 华阴市| 安龙县| 乌拉特前旗| 枣阳市| 焦作市| 麻栗坡县| 璧山县| 邓州市| 巢湖市| 蒙阴县| 若尔盖县| 芮城县| 卢湾区| 盐源县| 科技|