Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentLinkedQue是否可以具有固定大小并覆盖旧元素?_Java_Multithreading_Concurrency_Thread Safety_Java.util.concurrent - Fatal编程技术网

Java 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

如果我做对了,ConcurrentLinkedQue将充当堆栈,如果您使用
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,也就是说,我应该在前面提到,使用一个固定大小的
阻塞队列
,这将允许您施加背压。