“池” 是什么,我们联想到池塘,用来养鱼的。我们可以随时捞两条鱼出来,满足我们的饱腹之欲。
这里突出两个概念,一个是“养”,即是保存并保鲜着;一个是“随时”,就是方便取用的意思。
如果自家没有池塘,要吃鱼会怎么办,就是要开车到集市中买两条鱼回来做,不方便。
在开发中我们会经常遇到池的概念,比如线程池啊,数据库连接池啊等等。当然这些都属于远程连接的一些池的处理。我们理解的就是为了加快访问速度,创建的这些池的处理。
我们可以说池的技术可以有以下这些好处:
1.对象开始就创建好了,不需要重新创建,拿出来就可以用,比如内存空间的初始化。
2.io可以复用,io的低延迟性拖累了整个系统的吞吐量,尤其是在io创建流或连接上,通过一次性创建后续保持复用,避免首次创建重新连接。
通过这两点好处还会带来以下的一些特征:
1.由于池的大小固定性,也避免了资源不停的做横向获取的浪费。
2.对象重复使用,内存稳定,减少内存回收几率。
整个池在整个程序类似一个单例,就如同每个线程可知道有这个池塘,都可以去这个池塘拿出一个内容出来用。比如拿出来直接计算。
但是到这里大家可能会觉得这个不就是一个容器么,放着我我已经初始化好了的对象,是不是和Java的Spring容器很像,但是池还会有更多的内容,比如对象的状态,是否能用,对象的心跳保持,保证新鲜等。
我们希望池都有哪些功能,比如创建的大小,创建的方法,当对象有问题销毁的方法,如何发现有问题的检测方法;还有就是取用的时候,别人可以不被取到,同时当整个池都用完之后,有足够的应对措施保证取用的正确性。比如给用户报告----我不够用了,或是说你先在这等等,等一个人用完了你再拿过去用。
下面我们来看看Java的包中一个比较好用的一个对象池,Apache-common-pool。
首先这个对象池的工具有个接口(ObjectPool),该接口可以被我们实现为具体的池的操作。此接口含有两个重要的方法,borrowObject() 和 returnObject(),一个是借(取),一个是还。另外为了整个池的初始化时需要往池中添加元素对象,也就是还有addObject()方法。在我们使用的时候,如果发现池中某个元素对象有问题,希望释放掉它,那么还有 invalidateObject()方法。到现在为止我们知道了有这么一个接口,实现创建,用还,失效等生命周期的管理。
大家可以使用该接口做简单的池的处理实践。