Java ConcurrentLinkedQue是否可以具有固定大小并覆盖旧元素?
如果我做对了,ConcurrentLinkedQue将充当堆栈,如果您使用Java ConcurrentLinkedQue是否可以具有固定大小并覆盖旧元素?,java,multithreading,concurrency,thread-safety,java.util.concurrent,Java,Multithreading,Concurrency,Thread Safety,Java.util.concurrent,如果我做对了,ConcurrentLinkedQue将充当堆栈,如果您使用pollLast() 现在我的问题是,我需要设置大小的ConcurrentLinkedQue。我的生产商没有停止,所以即使我有16GB的内存,我最终也会耗尽。那么有没有可能设定一个固定的尺寸呢 我的实施: ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>(); ConcurrentLinkedQueue=新建Conc
pollLast()
现在我的问题是,我需要设置大小的ConcurrentLinkedQue。我的生产商没有停止,所以即使我有16GB的内存,我最终也会耗尽。那么有没有可能设定一个固定的尺寸呢
我的实施:
ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>();
ConcurrentLinkedQueue=新建ConcurrentLinkedQueue();
生产者(线程1):运行queue.add(行)代码>
使用者(线程2):运行queue.pollLast()代码>
请注意,两个线程都在中运行,而真正的循环则在中运行。这是因为要求。这就是为什么我使用concurrentlinkedeque
而不是ArrayBlockingQueue
或SynchronousQueue
,因为它是非阻塞的
我还需要声明任何已同步的
ConcurrentLinkedQue
可以有固定大小吗
不,它是“基于链接节点的无界并发Deque
。”
我是否需要声明任何已同步的
ConcurrentLinkedQue
本身是线程安全的。仅复合操作(如覆盖旧元素)需要同步
ConcurrentLinkedQue
能否覆盖旧元素
我认为没有这样的方法。这是一个复合动作,需要
- 记住你将要改变的元素的位置以及之前/之后的所有元素李>
- 改变元素李>
- 恢复顺序(将元素放回原处)
这三个操作应在同步的块中执行。@TrtTrt,生产者是否知道要将集合限制为的大小?@TrtTrt,您可以在放置新元素之前估计集合的大小in@TrtTrt,如果没有空间放置新项目,您可以等待(让制作人等待)直到使用者获取一个元素(释放一些空间)并通知producer@TrtTrt,也就是说,我应该在前面提到,使用一个固定大小的阻塞队列
,这将允许您施加背压。