java ArrayBlockingQueue put和take同时会造成死锁?

时间:2014-09-21 22:23:58

标签: java concurrency

ArrayBlockingQueue的take和put函数如下所示:

`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();
     }
   }
 }
` 

我的问题是假设现在队列中没有元素,我调用take()。然后调用线程将由notEmpty.await()等待,同时线程持有锁的监视器。如果我从另一个假设要将新元素添加到队列中的线程调用put(),则put()函数将在line lock.lock()行等待,直到take()调用unlock()。我对么?如果我是对的,就会出现僵局。

1 个答案:

答案 0 :(得分:2)

不,Condition#await()州的javadoc

  

与此Condition相关联的锁被原子释放和   当前线程因线程调度而被禁用   在发生四件事之一之前,他们处于休眠状态:[...]

所以Lock对象被释放,可以被另一个线程获取。