gpt4 book ai didi

java - 对 LinkedBlockingQueue 的 take 方法的说明

转载 作者:行者123 更新时间:2023-11-29 05:16:19 26 4
gpt4 key购买 nike

我有一个 LinkedBlockingQueue,以及一些在其上运行的线程。

 public void run(){
...
foo(linkedBlockingQueue.take());
...
}

public void foo(Object o){
synchronized(o){
//operate on the object
....
//after operate re-insert the object inside the queue
}
}

如果我遇到这种情况:

具有 5 个元素的阻塞队列和“最幸运”的线程获得了第一个元素的控制权,因此:

  • 同时需要第一个元素的其他线程将放入wait?。
  • 如果第一句是对的,那么使用synchronized block 就没有用了吗?
  • 在没有互斥排除的情况下,其他线程可以在拾取第一个元素并插入这个元素时访问间隔上的其他位置吗?

提前致谢。

最佳答案

a blocking queue with 5 elements and the "luckiest" thread have gained the control of the first element so:

other threads that concurrently wanted the first element will put in wait?.

不,其他线程将获得第二个、第三个等等元素,直到队列为空。只有在这种情况下,他们才会阻止。

it is useless to use a synchronized block if the first sentence is right?

这个问题的答案与第一个问题的答案无关。如果您在单个线程中处理获取的对象或者它是不可变的,那么是的,不需要同步,但否则您可能需要它。

other threads can access other positions on the interval when pickup the first element and insertion of this one without mutex exclusion?

您在问是否其他线程可能会从队列中获取更多元素,直到第一个线程被重新添加?是的,队列没有被锁定,它可以被其他线程访问。

关于java - 对 LinkedBlockingQueue 的 take 方法的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26452023/

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