ConcurrentLinkedDeque可以具有固定的大小并覆盖旧元素吗?

时间:2018-07-01 12:46:10

标签: java multithreading concurrency thread-safety java.util.concurrent

如果我理解正确,那么如果您使用pollLast(),ConcurrentLinkedDeque就可以像堆栈一样使用?

现在,我的问题是我需要设定大小的ConcurrentLinkedDeque。我的制作人不会停下来,所以即使我有16GB的内存,我最终也会用光。这样可以设置固定大小吗?

我的实现:

ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>();

生产者(线程1):运行queue.add(line); 使用者(线程2):运行queue.pollLast();

请注意,两个线程均在 while true循环中运行。这是由于要求。这就是为什么我使用ConcurrentLinkedDeque而不是ArrayBlockingQueueSynchronousQueue的原因,因为它是非阻塞的。

我还需要声明任何内容synchronised吗?

1 个答案:

答案 0 :(得分:2)

  

ConcurrentLinkedDeque的大小可以固定吗?

否,这是“基于链接节点的无界并发Deque。”

  

我需要声明什么synchronised吗?

ConcurrentLinkedDeque本身是线程安全的。仅对于复合操作(例如覆盖旧元素)才需要同步。

  

ConcurrentLinkedDeque可以覆盖旧元素吗?

我不认为有这种方法。这是需要执行的复合操作

  • 记住要更改的元素的位置以及之前/之后的所有元素;
  • 更改元素;
  • 恢复顺序(将元素放回原处)。

这三个动作应在synchronized块内执行。