gpt4 book ai didi

java - 如果同时放入和放入Java LinkedBlockingQueue中只有一个元素,将会发生什么情况?

转载 作者:行者123 更新时间:2023-12-03 12:58:56 26 4
gpt4 key购买 nike

LinkedBlocking队列有两个锁,一个用于放置,一个用于获取。当队列的大小为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;

显然,当队列中只有一项时,放置线程和获取线程可以锁定,因此它们将分别在方法入队和出队中执行代码。我的意思是,如果在所有指针修改之后,让线程进入方法出队,是否不会与入队中的代码冲突?

这里的链接说:“但是,当队列为空时,就无法避免争用,因此需要额外的代码来处理这种常见的'edge'情况”

Is BlockingQueue completely thread safe in Java

最佳答案

BlockingQueue(LinkedBlockingQueue的父类(super class))的javadoc指出:

BlockingQueue implementations are thread-safe. All queuing methods achieve their effects atomically using internal locks or other forms of concurrency control.



“原子地”一词的意思是,如果同时发生两个操作(例如 puttake),则实现将确保它们按照契约(Contract)进行操作。效果就好像 put发生在 get之前,反之亦然。这也适用于边缘情况,例如您的带有一个元素的队列示例。

实际上,由于 putget阻止了操作,因此这两个操作的相对顺序无关紧要。使用 offer/ polladd/ remove,顺序确实很重要,但是您无法控制它。

请注意,以上内容仅基于javadoc的内容。假设我正确地解释了Javadoc,那么它适用于all1 BlockingQueue实现,无论它们使用一个还是两个锁...或根本不使用它们。如果 BlockingQueue实现不符合上述要求,那就是一个错误!

1-正确实现API的所有实现。那应该涵盖所有Java SE类。

关于java - 如果同时放入和放入Java LinkedBlockingQueue中只有一个元素,将会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56114156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com