Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java ArrayBlockingQueue同时放置和获取是否会导致死锁?_Java_Concurrency - Fatal编程技术网

java ArrayBlockingQueue同时放置和获取是否会导致死锁?

java ArrayBlockingQueue同时放置和获取是否会导致死锁?,java,concurrency,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

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()函数将在lock.lock()行等待,直到take()调用unlock()。我说得对吗?如果我是对的,就会出现僵局

不,美国的javadoc

与此
条件相关的锁被自动释放,并且
出于线程调度目的,当前线程被禁用,并且
在四件事中的一件发生之前处于休眠状态:[……]


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

来自:
“尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素将类似地阻塞。”
我说的是Lock.Lock()的锁;和lock.unlock(),因为两个函数使用同一个lock对象。当take()在lock.lock()之后并在调用lock.unlock()之前在那里等待时,函数put()将在lock.lock()行被阻塞。@tommi
notEmpty
引用从该
lock
对象创建的
条件
对象。当您对其调用
wait
时,它会释放该锁。