java线程系列---condition的讲解
? ? Condition 將 Object 監視器方法(wait、notify 和notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實現組合使用,為每個對象提供多個等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監視器方法的使用。
? ? ? ? 條件(也稱為條件隊列 或條件變量)為線程提供了一個含義,以便在某個狀態條件現在可能為 true 的另一個線程通知它之前,一直掛起該線程(即讓其“等待”)。因為訪問此共享狀態信息發生在不同的線程中,所以它必須受保護,因此要將某種形式的鎖定與該條件相關聯。等待提供一個條件的主要屬性是:以原子方式 釋放相關的鎖定,并掛起當前線程,就像Object.wait 做的那樣。
? ? Condition 實例實質上被綁定到一個鎖定上。要為特定 Lock 實例獲得 Condition 實例,請使用其 newCondition() 方法。
? ? ? ?作為一個示例,假定有一個綁定的緩沖區,它支持 put 和 take 方法。如果試圖在空的緩沖區上執行take 操作,則在某一個項變得可用之前,線程將一直阻塞;如果試圖在滿的緩沖區上執行 put 操作,則在有空間變得可用之前,線程將一直阻塞。我們喜歡在單獨的等待 set 中保存put 線程和 take 線程,這樣就可以在緩沖區中的項或空間變得可用時利用最佳規劃,一次只通知一個線程。可以使用兩個 Condition 實例來做到這一點。
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];?
? int putptr, takeptr, count;?
? ? ? ? public void put(Object x) throws InterruptedException {
? ? ? ? ? ? ?lock.lock();
? ? ? ? ? ? ?try {?
? ? while (count == items.length) notFull.await();
items[putptr] = x;?
?if (++putptr == items.length)
? ? ? ? ?putptr = 0; ++count;
? ? ? ? notEmpty.signal();?
?}?
? finally {
? ? ? lock.unlock();?
?} }?
? public Object take() throws InterruptedException {?
lock.lock();?
?try {?
? ? ? ?while (count == 0)?
? ? ? ? ? ? notEmpty.await();
? ? ? Object x = items[takeptr];?
? ? ? if (++takeptr == items.length)?
? ? takeptr = 0;?
--count;?
? ? notFull.signal();?
? ? return x;
}
? finally {?
?lock.unlock();?
?} } }
轉載于:https://www.cnblogs.com/javaTest/archive/2012/06/27/2589090.html
總結
以上是生活随笔為你收集整理的java线程系列---condition的讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP状态代码
- 下一篇: 扯一扯 之 面试经历