什么是Java中的对象池?

Him*_*shu 29 java object-pooling

什么是对象池以及什么是弱对象引用?

我们如何使用Java实现它们?

duf*_*ymo 34

对象池是应用程序将创建并保留的特定对象的集合,用于创建每个实例的代价高昂的情况.一个很好的例子是数据库连接或工作线程.该池检查实例的进出情况,例如图书馆外的书籍.

通常,对象池由Java EE应用程序服务器处理.如果您需要自己动手,最好使用Apache的对象池.不要自己写一个; 线程安全和其他问题可能使它变得复杂.

这是弱对象引用一个很好的参考.

  • 只是一点点评论:写一个游泳池并不困难.只需应用[flyweight pattern](https://en.wikipedia.org/wiki/Flyweight_pattern)并确保同步访问池.请参阅示例:这是一个很好的策略来同步_after_您检查了密钥并且它不存在,然后再次检查该密钥是否存在_当synchronized_(因为另一个线程可能在那个时间将它放入池中) .这减少了同步的开销. (2认同)

Boz*_*zho 14

检查公共池

提供了一个Object-pooling API

它通常用于创建昂贵的对象.为了避免您维护N个预先创建的对象池并重用它们.


Paŭ*_*ann 7

弱引用是一种由垃圾收集器专门处理的引用变量.

这引入了另一种可达性,任何对象可能是:

  • 强烈可达(只能通过普通引用从任何生命线程到达)
  • 弱可达(不强可达,但可通过弱引用(或多种方式,每种方式包括弱引用))
  • 根本无法到达

(还有Soft ReferencesPhantom References,我在这里省略了 - 它们的工作方式类似,并介绍了更多层次.)

如果根本无法访问对象,则可以随时对其进行垃圾回收.如果一个对象是强可访问的,则根本不能进行垃圾收集.如果垃圾收集器发现一个对象(或一组对象)是弱可达的(可能是多个弱引用),它会立即清除所有这些引用,然后无法访问这些对象(并且可以进行垃圾收集).

(实际上,"不可到达"和集合之间可能存在/可能是最终确定步骤,这也可能使对象再次可达.)

对于使用弱引用,您可以使用该类java.lang.ref.WeakReference- 实际引用位于此类的私有变量中,并且只能使用构造函数进行设置,然后才能清除.如果除了引用本身之外还需要其他数据,则可以对此类进行子类化,当引用被清除时,它仍应存在.

对于"避免代价高昂的实例化"意义上的对象池,弱引用不是正确的工具.


Pet*_*rey 5

对象池是任何被回收的对象集合,而不是在每次需要它们时重新创建。

根据您的要求,您可以通过多种方式实现这样的对象池。对象池用于帮助提高性能,即使对于简单的对象,但在 Java 5+ 中没有那么有用。

我建议您仅将它们用于连接到外部资源(例如文件、套接字或数据库连接)的对象。