现在的位置: 首页 > 综合 > 正文

java线程系列—condition的讲解

2018年04月12日 ⁄ 综合 ⁄ 共 1321字 ⁄ 字号 评论关闭

    ConditionObject 监视器方法(waitnotifynotifyAll)分解成截然不同的对象,以便通过将这些对象与任意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(); 

 } } }

抱歉!评论已关闭.