加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java-Spring ObjectPooling和线程阻塞

发布时间:2020-12-15 01:19:01 所属栏目:大数据 来源:网络整理
导读:我有一个为豆定义的Spring CommonsPoolTargetSource.我试图了解池的工作方式,以及当对象返回时池. 具体来说,如果我有一个工作程序,它需要一个池化对象并对其调用两个方法,如下所示: public class MyWorker { @Resource Foo pooledFoo; void doWork() { pool

我有一个为豆定义的Spring CommonsPoolTargetSource.我试图了解池的工作方式,以及当对象返回时池.

具体来说,如果我有一个工作程序,它需要一个池化对象并对其调用两个方法,如下所示:

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()返回的实例不同?

最佳答案
您对流的描述是正确的-对象将在每次调用之前从池中借用,然后再返回给它.

但是,您的下一个假设是错误的-完全有可能对与stepA相同的池实例调用stepB.这取决于池上的“搅动”-不同线程借用和返回对象的频率.在低负载下,同一对象可能会被重用.

因此,这里没有任何保证.对于池对象,您通常希望使池对象处于适合下一个借用者使用的状态,而不管借用者是否是同一线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读