LinkedBlocking Queue有两个锁,一个用于put,一个用于take。当队列的大小为1时,我认为两个线程可以同时锁定和操作队列,这将导致未定义的行为。我错了吗?
// method put: // method take: // put lock // take lock putLocK.lockInterruptibly(); takeLock.lockInterruptibly(); ... ... while(count.get() == capacity){ while(count.get() == 0){ notFull.await(); notEmpty.await(); } } enqueue(node); x = dequeue();// method enqueue: // method dequeue: last = last.next = node; Node<E> h = head; ... Node<E> first = h.next; h.next = h; head = first; E x = first.item; first.item = null; return x;
当队列中只有一个项目时,显然可以将线程和线程锁定,因此它们将分别在方法入队和出队中执行代码。我的意思是如果线程进入方法出列,在所有指针修改后,不会与enqueue中的代码冲突?
这里的链接说“但是当队列为空时,无法避免争用,因此需要额外的代码来处理这种常见的”边缘“情况”
在Java中,BlockingQueue是否完全是线程安全的
慕码人2483693
慕丝7291255
慕哥6287543
相关分类