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();
}