java生产者消费者问题代码分析
作者要的是一個生產者生成,接著必須有一個消費者消費,那這不是需要單線程嗎?或者使用1個大小的阻塞隊列。所以只談論問題本身,不談論好不好。
?
具體代碼:
Java代碼 ??
Java代碼 ??
原因分析:
1、假設前面有2個producer(此時available=true)
1.1、一個在等待lock
1.2、一個await
2、consumer生成內容后,available=false,produced.signal(); 最后lock.unlock();
3.1、因為lock.unlock所以會觸發一個lock獲取到鎖(雖然signal也會觸發等待這個條件的其他線程,但是多線程大家都知道什么時候觸發這是不確定的),如果此時正好是[1.1]那么因為available=false,執行完釋放鎖
3.2、produced.signal()所以會觸發一個await的producer;
?
解決方案:
只要保證[3.1]還是需要await即可解決問題
?
所以加一個 AtomicInteger producedAwaitCounter = new AtomicInteger(0); 統計當前等待的生產者,如果當前available=false,但已經有生產者生成了內容,那么先等待消費者消費了再說
?
? ? ? ? ? ? if (available || producedAwaitCounter.get() > 0) {
? ? ? ? ? ? ? ? producedAwaitCounter.incrementAndGet();
? ? ? ? ? ? ? ? produced.await(); // 放棄lock進入睡眠
? ? ? ? ? ? ? ? producedAwaitCounter.decrementAndGet();
? ? ? ? ? ? }
?
當然最簡單的是使用:自旋,原理可以自己分析下:
? ? ? ? ? ? while (available) {
? ? ? ? ? ? ? ? produced.await(); // 放棄lock進入睡眠
? ? ? ? ? ? }
?
?
Java代碼 ??
總結
以上是生活随笔為你收集整理的java生产者消费者问题代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解Android定位,AndroidG
- 下一篇: hdu 4322 最大费用流