在Java中找不到现代的Object Pool实现

tim*_*tea 37 java multithreading object-pooling

我正在寻找Java中的对象池的现代实现.我可以看到apache commons one,但说实话,我宁愿使用泛型,以及来自更新版本java的并发内容.

公共泳池真的运作良好吗?代码看起来很漂亮,呃,丑陋.

我需要一些允许自定义活动验证等的东西.

谢谢!

Pas*_*ent 18

我可以看到apache commons one,但说实话,我宁愿使用泛型,以及来自更新版本java的并发内容.

嗯,事实是这种项目(通用对象池)并没有太大的吸引力,因为现在对它们的需求很少(对象创建很便宜).这可能解释了为什么你看不到它们(实际上,我只知道Commons Pool).

话虽如此,如果泛型是您的主要关注点,您可以修补Commons Pool,请参阅POOL-83,它附有补丁.

公共泳池真的运作良好吗?代码看起来很漂亮,呃,丑陋.

它确实有一些已知的错误(四个),但据我所知,它有效.关于最后一句,好吧,如果你认为你可以写出更好的东西,如果你有时间,为什么不做呢?

我需要一些允许自定义活动验证等的东西.

您没有无限多个选项.或

  1. 找到能满足你所​​需要的东西(我不知道这样的库,这并不代表没有任何东西).
  2. 如果找不到能满足您开箱即用的所有功能的东西,那么请扩展现有的解决方案.
  3. 推出自己的解决方案.

  • 感谢您的回答 - 我完全清楚对象创建本身非常便宜.我永远不会使用对象池来重用仅存在于内存中的对象.有龙.但是,对象通常代表一些外部昂贵的创建资源,您无法以低成本创建.想想数据库连接或SSL连接.它的这种想法我想要集合.我更新了公共池代码.我会在这里张贴补丁或其他东西. (3认同)
  • @PascalThivent我同意对象_creation_很便宜,但是对象_initialization_可能很昂贵。换句话说,与数据库连接完全相同。 (2认同)
  • 我没有看到对象创建是如何廉价的,这在这个问题中似乎被提到了很多,与对象池变得多余有什么关系。便宜必须与它出现的次数成对出现,一粒大米本身很便宜,但如果你买成吨的大米就很贵。因此,当对象创建成为瓶颈时,对象池非常有用,瓶颈取决于初始化的数量,而不仅仅是单个初始化的成本。 (2认同)

emo*_*ory 8

Commons Pool是您项目的理想选择.

  1. 泛型接口 - 公共池最明显的问题是它的预泛化接口.有很多方法可以解决这个问题.您可以
    1. 做铸造;
    2. 实现一个为你做铸造的并行接口; 要么
    3. 使用Pascal识别的补丁
  2. 来自更新的Java的并发资料 - 这是一个你不应该关心的实现细节.如果并发性是正确的,那么实现正确性无关紧要.或者,使用更新的东西但其并发性错误的池实现仍然是一个不好的候选者.
  3. 丑陋的代码 - 你应该使用它,而不是嫁给它.
  4. 自定义活动验证 - 实现validateObject以测试对象的活跃度.死亡的物体将被摧毁.您还可以实现Cron任务以定期借用和返回对象 - 强制及时消除死对象.

  • 我不认为并发是一个你不应该关心的实现细节; 如果你想提高性能,你只会使用一个对象池,那么在锁定/等待免费数据结构可用的情况下,为什么你会使用昂贵的监视器同步呢? (3认同)

Nam*_*ter 7

如果不知道您需要什么功能,很难提出建议.

如果池中的对象数量是固定的,则可以使用@codedevour提到的问题中的a BlockingQueue作为示例

如果到池所需的值可以用一个键关联,您可以使用地图制作工具番石榴

ConcurrentMap<Key, Connection> connections = new MapMaker()
       .concurrencyLevel(32)
       .softKeys()
       .weakValues()
       .expiration(30, TimeUnit.MINUTES)
       .evictionListener(
           new MapEvictionListener<Key, Connection>() {
             public onEviction(Key key, Connection connection) {
               connection.close();
             } 
           });
       .makeComputingMap(
           new Function<Key, Connection>() {
             public Connection apply(Key key) {
               return createConnection(key);
             }
           });
Run Code Online (Sandbox Code Playgroud)