2019独角兽企业重金招聘Python工程师标准>>>

对象池common-pool2源码分析

对象池common-pool2策略分析

从前两篇的分析中可以看出对象池中的对象会被激活,钝化,销毁等,那么做这些操作的对象需要满足什么条件呢,与这些操作之后相对应的对象的状态是什么样的呢?

首先从PooledObjectState开始分析

public enum PooledObjectState {/*** In the queue, not in use.*/IDLE,/*** In use.*/ALLOCATED,/*** In the queue, currently being tested for possible eviction.*/EVICTION,/*** Not in the queue, currently being tested for possible eviction. An* attempt to borrow the object was made while being tested which removed it* from the queue. It should be returned to the head of the queue once* eviction testing completes.* TODO: Consider allocating object and ignoring the result of the eviction*       test.*/EVICTION_RETURN_TO_HEAD,/*** In the queue, currently being validated.*/VALIDATION,/*** Not in queue, currently being validated. The object was borrowed while* being validated and since testOnBorrow was configured, it was removed* from the queue and pre-allocated. It should be allocated once validation* completes.*/VALIDATION_PREALLOCATED,/*** Not in queue, currently being validated. An attempt to borrow the object* was made while previously being tested for eviction which removed it from* the queue. It should be returned to the head of the queue once validation* completes.*/VALIDATION_RETURN_TO_HEAD,/*** Failed maintenance (e.g. eviction test or validation) and will be / has* been destroyed*/INVALID,/*** Deemed abandoned, to be invalidated.*/ABANDONED,/*** Returning to the pool.*/RETURNING
}

以上枚举定义了对象可以出现的所有状态:

IDLE,空闲,在队列中;

ALLOCATED:在使用;

EVICTION:在队列中,正在测试中,可能会被驱逐;

EVICTION_RETURN_TO_HEAD:不是在队列中,正在测试中,可能会被驱逐.当驱逐测试结束的时候,它应该返回队列的前端;

VALIDATION:在队列中,正在校验;

VALIDATION_PREALLOCATED:不在队列中,使用前进行校验;

VALIDATION_RETURN_TO_HEAD:不在队列中,正在校验,校验结束后应该返回队列的前端;

INVALID:无效的;

ABANDONED:废弃的;

RETURNING:还回对象池.

池对象状态的改变发生在使用,还回,激活等操作的时候,即在调用GenericObjectPool内相应的方法时发生改变.

但DefaultPooledObject的方法里能更清晰的看到状态的变化.

对象创建后默认的状态是空闲

private PooledObjectState state = PooledObjectState.IDLE;

开始驱逐前的测试,状态由空闲变为测试中

public synchronized boolean startEvictionTest() {if (state == PooledObjectState.IDLE) {state = PooledObjectState.EVICTION;return true;}return false;
}

测试结束,由测试中变为空闲

public synchronized boolean endEvictionTest(Deque<PooledObject<T>> idleQueue) {if (state == PooledObjectState.EVICTION) {state = PooledObjectState.IDLE;return true;} else if (state == PooledObjectState.EVICTION_RETURN_TO_HEAD) {state = PooledObjectState.IDLE;if (!idleQueue.offerFirst(this)) {// TODO - Should never happen}}return false;
}

由空闲变为在使用,或由在队列中正在进行测试变为不在队列中正在测试

public synchronized boolean allocate() {if (state == PooledObjectState.IDLE) {state = PooledObjectState.ALLOCATED;lastBorrowTime = System.currentTimeMillis();lastUseTime = lastBorrowTime;borrowedCount++;if (logAbandoned) {borrowedBy = new AbandonedObjectCreatedException();}return true;} else if (state == PooledObjectState.EVICTION) {// TODO Allocate anyway and ignore eviction teststate = PooledObjectState.EVICTION_RETURN_TO_HEAD;return false;}// TODO if validating and testOnBorrow == true then pre-allocate for// performancereturn false;
}

由在使用变为归还

public synchronized boolean deallocate() {if (state == PooledObjectState.ALLOCATED ||state == PooledObjectState.RETURNING) {state = PooledObjectState.IDLE;lastReturnTime = System.currentTimeMillis();borrowedBy = null;return true;}return false;
}

无效的

public synchronized void invalidate() {state = PooledObjectState.INVALID;
}

转载于:https://my.oschina.net/u/657390/blog/659502

对象池common-pool2源码分析之对象状态相关推荐

  1. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  2. Netty技术细节源码分析-Recycler对象池原理分析

    本文是该篇的修正版 本文的github地址:点此 该文所涉及的netty源码版本为4.1.6. Netty的对象池Recycler是什么 Recycler是Netty中基于ThreadLocal的轻量 ...

  3. 案例:演示pageContext对象的使用及源码分析获取属性方法

    一.创建pageContext.jsp <%@ page language="java" contentType="text/html; charset=UTF-8 ...

  4. django源码分析 LazySetting对象

    一.django中通过LazySetting对象来获取项目的配置,LazySetting对象有什么特性?为什么使用这个对象? LazySetting顾名思义,就是延迟获取配置内容.比如,我们定义了一个 ...

  5. jQuery1.9.1源码分析--Deferred对象和Promise对象

    jQuery.extend({Deferred: function(func) {// 数据集中管理var tuples = [['resolve', 'done', jQuery.Callbacks ...

  6. {{jQuery源码分析}}jQuery对象初始化的多种传参数形式

    jQuery对象初始化的传参方式包括: 1.$(DOMElement) 2.$('<h1>...</h1>'), $('#id'), $('.class') 传入字符串, 这是 ...

  7. jquery Callbacks 回调对象的读书笔记-源码分析

    2019独角兽企业重金招聘Python工程师标准>>> Callbacks:回调对象,函数的一个统一管理(观察者模式) 基本使用 function test1() {console. ...

  8. Spark源码分析之Master状态改变处理机制原理

    一Master故障挥着宕机,可能触发新的Master选举 当重新选择Leader的时候,会进行集群的恢复,在恢复的过程中,就会向Worker和AppClient发送MasterChanged消息. p ...

  9. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

最新文章

  1. 以太坊Geth几种同步模式
  2. 网络空间安全之信息追踪——学习笔记 利用门户网站,综合信息追踪
  3. JAVA窗帘_HomeControl 智能家具系统,包括灯光,窗帘的控制,设备,房间,情景模式的添加 Java Develop 240万源代码下载- www.pudn.com...
  4. Android布局琐碎(原)
  5. 【译】Consortium Chain Development
  6. Balluff推出刀具识别系统
  7. 什么样的事才是有意义的
  8. 什么是PermGen泄漏?
  9. 华为机试HJ108:求最小公倍数
  10. 生成手写文字图片_如何把手机图片转成PDF文件?这个技巧你一定能学会!
  11. 影响科学圈的那些计算机代码
  12. Pytorch-《Deep learning with pytorch》1.2.1训练imagenetmini
  13. 程序员大佬教你如何用python制作中国象棋!一看就会
  14. png转成SVG方法
  15. 3.灰色预测模型(Gray Forecast Model)
  16. FMDB数据库的升级
  17. android usb触摸屏idc实现触摸唤醒
  18. 中国石斛行业渠道营销策略与发展态势研究报告2022版
  19. select2搜索内容显示搜索词
  20. Linux下使用github

热门文章

  1. JAVA面试--电商业内大厂
  2. 二. python面向对象(内置方法and析构函数)
  3. 企业要做好安全遵从的五个实用技巧
  4. 公安部起草《“十三五”平安中国建设规划》并公开征求意见
  5. 不常见正则表达式总结
  6. 《Puppet实战手册》——1.4 利用Git管理配置清单
  7. 《Linux系统编程(第2版)》——2.6 关闭文件
  8. Boost::Bind 基础
  9. topic1:Qt入门之搭建环境与hello world看Qt开发框架
  10. JS设计模式初识(四)-迭代器模式