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

标签 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 而不是 ArrayBlockingQueue 或 SynchronousQueue,因为它是非阻塞的。

我还需要声明任何synchronized吗?

最佳答案

Can ConcurrentLinkedDeque have a fixed size?

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

Do I need to declare anything synchronised?

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

Can ConcurrentLinkedDeque overwrite old elements?

我认为没有这样的方法。这是一个复合 Action ,需要

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

这三个操作应在同步 block 内执行。

关于java - ConcurrentLinkedDeque 可以有固定大小并覆盖旧元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51123435/

相关文章:

python - `DummyExecutor` 用于 Python 's ` future `

java - 遇到一些愚蠢的语法错误

java - 如何将这些新消息传递给另一个类

java - Android InputStream 无法接收来自蓝牙 HC-05 的完整消息

java - ExecutorService "happens-before"中的 awaitTermination 是否在其后执行任何代码?

java - 什么时候调用 java 的 thread.run() 而不是 thread.start()?

java - 禁用 Dart 和 Kotlin 插件后 Android Studio 未运行

java - 流处理 - 按名称在给定目录中搜​​索文件/目录

java - 运行java程序时出现FileNotFoundException错误

java - 多线程应用程序中的事件处理