Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 ArrayBlockingQueue:是否应用于创建池?_Java_Multithreading_Java.util.concurrent - Fatal编程技术网

Java ArrayBlockingQueue:是否应用于创建池?

Java ArrayBlockingQueue:是否应用于创建池?,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,我试图创建一个池对象来保留旧对象,以防再次使用它们(避免实例化新对象)。我在谷歌上搜索了ArrayBlockingQueue,有些人用它来创建池。但有一个问题我不知道:当一个对象插入到它时,它会重新创建一个新实例吗 例如:ArrayBlockingQueue池=newarrayblockingqueue(3) 短时间后:pool=(3,4,5) 所以,我想知道是将6分配给旧的整数对象(值为5),还是Java创建了一个新的整数对象并将其值分配为6 谢谢:)请看,您不必担心底层实现,这正是java中

我试图创建一个
对象来保留旧对象,以防再次使用它们(避免实例化新对象)。我在谷歌上搜索了
ArrayBlockingQueue
,有些人用它来创建
。但有一个问题我不知道:当一个对象插入到它时,它会重新创建一个新实例吗

例如:
ArrayBlockingQueue池=newarrayblockingqueue(3)

短时间后:
pool=(3,4,5)

所以,我想知道是将6分配给旧的整数对象(值为5),还是Java创建了一个新的整数对象并将其值分配为6


谢谢:)

请看,您不必担心底层实现,这正是java中“封装”的用意。根据Oracle文档,“put”实际上是在尾部插入元素。因此,我认为没有任何“旧对象”的替换。

我严重怀疑,在这种情况下,任何值的替换都是实际的。此外,我不确定拥有这样一个对象池的自定义实现是否有用,除非您的代码生成并丢弃了大量的对象


更有趣的是,您在问题中没有提到任何关于线程安全或多线程的内容,但您使用了这些标记。您希望通过这样一个池实现什么
ArrayBlockingQueue
是一个线程安全的集合,其中一个(或多个)线程转储对象,而一个(或多个)线程删除对象。如果队列中需要一个对象但没有,或者添加了一个对象但队列中没有容量,那么有很多方法可以提供不同的行为。您应该查看,看看它是否真的是您想要的
ArrayBlockingQueue

新对象就是在这里创建的:

pool.put(6);
当您想到自动装箱将其转换为:

pool.put(new Integer(6));

队列既不创建也不重用这些对象,而是存储您提供给它的对象。

数组锁定队列由参数类型的数组支持。因此,在内部,它看起来像这样:

E[] items;
并在您的案例中实例化为

Integer[] items;
根据
ArrayBlockingQueue
的定义,
put
方法实际上调用了这个
insert
方法:

private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex);
    ++count;
    notEmpty.signal();
}

因此,当您调用
pool.put(6)
时,会发生的情况是
int
6被装箱到
Integer
对象中并传递给方法(因为
E
现在是
Integer
)。因此,可以肯定地说,它确实创建了一个新的
Integer

实例。这个问题非常不清楚,因此我建议进行一些编辑,以我的理解为准。希望我没有误解你的问题。
private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex);
    ++count;
    notEmpty.signal();
}