色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

java - 求對ArrayBlockingQueue中一段源碼的解釋

瀏覽:94日期:2023-11-16 10:11:21

問題描述

為什么take()方法在判斷隊列中元素個數是否為0的時候使用了while循環,而不是if;

java - 求對ArrayBlockingQueue中一段源碼的解釋

我認為,如果notEmpty.await()方法既然蘇醒返回了 ,那么此線程肯定拿到了lock。

而蘇醒的原因也是因為put()方法放入了新的元素,而其他線程無法拿到鎖,自然無法取走元素,那么此時對于拿到鎖的線程來說count肯定不為0了,應該放心的執行 dequeue()獲取元素就可以了。 不知道作者使用了while是何意呢?

問題解答

回答1:

“notEmpty.await()方法既然蘇醒返回了 ,那么此線程肯定拿到了 lock” 這句話是正確的。

假設你寫的代碼是:

if (count == 0) notEmpty.await();

可以明確的一點就是我們需要保證在 return dequeue() 之前需要滿足的一個條件是 count != 0。我們假設 線程A 此時拿到了 lock,那么 線程A 的 notEmpty.await() 此時便會停止阻塞,準備向下執行 return dequeue()。但是假設在競爭激烈的條件下,線程A 拿到 lock 之后,準備執行下一條 JVM 指令的時候,線程B 此時搶占了 lock,然后繼續向下執行 return dequeue(),剛好使得 count 變為了 0;而此時因為寫的只是 if(count == 0),那么線程 A 在拿到 lock 之后,還是會繼續向下執行 return dequeue(),從而導致了錯誤。

關于為什么wait()、await() 這樣當條件不滿足時就阻塞的方法一定要在 while 循環中使用,可以參考《Effective Java》第二版第 69 條(244 頁)。

回答2:

public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0)throw new IllegalArgumentException(); this.items = new Object[capacity]; lock = new ReentrantLock(fair); notEmpty = lock.newCondition(); //notEmpty 就是這個鎖的條件 notFull = lock.newCondition();}

所以在你這段代碼里當前隊列為空時(count==0),調用了notEmpty.await(),這段代碼對鎖是有影響的,實際上底層上已經釋放了鎖,只是這個方法保證了被喚醒時一定又能夠拿回鎖(當有元素放入隊列會調用notEmpty.signal()進行喚醒),那為什么需要使用while呢?因為insert后lock.unlock,未必notEmpty.await()立即被喚醒,可能之前插入一個線程運行remove方法

標簽: java
相關文章:
主站蜘蛛池模板: www.久久久| 丁香五香天堂 | 永久黄网站色视频免费网站 | 国内精品影院久久久久 | 日韩视频中文字幕 | 怡红院免费va男人的天堂 | 国产精品欧美一区二区 | 午夜黄色福利视频 | 91视频一区| 欧美成人全部免费观看1314色 | 欧美精品束缚一区二区三区 | 欧美日韩国产综合一区二区三区 | 亚洲精品在线播放视频 | 国产成人综合网亚洲欧美在线 | 日韩精品一级毛片 | 毛片在线看免费 | 一级成人毛片免费观看 | 男人天堂网在线视频 | 亚洲在线视频一区 | 欧美另类精品一区二区三区 | 91成人精品 | 亚洲va老文色欧美黄大片人人 | a国产片 | 日本在线理论片 | 国产国语在线播放视频 | 久久国产成人精品 | 成人午夜免费在线观看 | 欧美人与鲁交大毛片免费 | 国内xxxx乱子另类 | 日本高清免费视频色www | 成人在线免费看 | 久久色视频在线观看 | a毛片免费播放全部完整 | 69精品免费视频 | 国产高清在线精品一区a | 国产在线观看91精品一区 | 国产一区二区在线观看视频 | 国产黄三级三·级三级 | 精品一区二区三区在线视频观看 | 三级黄色片网站 | 99re热视频 |