java - Spring 对象池和线程阻塞

标签 java spring concurrency pooling

我有一个为 bean 定义的 Spring CommonsPoolTargetSource。我试图了解池的工作原理,以及何时将对象返回到池中。

具体来说,如果我有一个 worker,它接受一个池对象并在其上调用两个方法,如下所示:

public class MyWorker {
    @Resource
    Foo pooledFoo;

    void doWork()
    {
        pooledFoo.doStepA();
        pooledFoo.doStepB();
    }
}

从我运行的测试中可以看出,pooledFoo 实际上不是 Foo 的实例,而是 Pool 提供的代理。上面的流程是:

  • foo 上调用 doStepA() 从池中检索一个值(如果一个值不可用则阻塞线程),
  • doStepA 在 pooledFoo 上执行
  • 当 doStepA 完成时,pooledFoo 实例返回到池中
  • 控制返回到doWork方法,该方法继续

如果这是正确的(如果不正确请告诉我),假设调用 doStepB() 时从池中返回的 pooledFoo 是否公平?与为 doStepA() 返回的实例不同吗?

最佳答案

您对流程的描述是正确的——对象将在每次调用前从池中借用,然后返回给它。

但是,您的下一个假设是错误的 - stepB 完全有可能针对与 stepA 相同的池化实例调用。这取决于池中的“流失”——不同线程借用和归还对象的频率。在低负载下,可能会重复使用相同的对象。

所以这里没有任何保证。对于池化对象,您通常希望将池化对象保持在适合下一个借用者使用的状态,而不管借用者是否是同一线程。

关于java - Spring 对象池和线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114020/

相关文章:

java - 我克隆了一个存储库并对其进行了原始工作,但名称仍在其中

java - Hibernate Spring MVC 注入(inject) Autowiring 问题

java - 使用spring boot配置SOAP服务出错

java - 为什么在while循环中等待Condition?

Java:与 HikariDataSource 对象的并发

java - 比较两个字符串为 "greater than ' 0' ..and NULL"

mysql - 同时进行 SELECT 和 UPDATE - 锁定以防止并发问题

sql - 将 pg_try_advisory_xact_lock() 放在嵌套子查询中?

java - 如何导出MySQL工作台数据库以供在其他计算机上运行的Java应用程序使用?

java - 调用 dao.findByID(id) 后实体属性没有改变