JAVA池化
缓冲池
设计要点:包含三个队列:空缓冲队列(emq),装满输入数据的输入的队列(inq),装满输出数据的输出队列(outq),输入程序包括收容输入(hin),提取输入(sin),输出程序包括收容输出(hout)和提取输出(sout)。
注意点:输入程序和输出程序会对缓冲区并发访问,因此可以对缓冲区设置一个互斥信号量,或者对关于缓冲区的操作加锁。hin,sin,hout,sout之间还有同步关系,可以通过if语句判断决定执行先后顺序
线程池
设计要点:线程池和线程一样,也具有最基本的就绪,运行,结束,等状态。ThreadPoolService类包含state,ThreadCount,一个线程容器,一个任务容器等成员变量,初始化时在线程容器中添加一定数目的线程(线程的初始化传入一个this参数,说明他属于的线程池),对于每个线程,run方法内获得任务容器,如果容器中含有就绪的任务,就执行它,即该任务占用了该线程,线程采用轮询(或者其他设计)的方式,执行task,
注意点:线程,任务容器都会并发访问任务(改变任务的状态),因此对关于任务的操作需要加锁。
连接池
设计要点:ConnectionPool初始化时加入若干个connection,在高层通过getConnection获得容器中的某个connection,若容器中不存在connection就再初始化一个connection(),当不需要数据库操作的时候,传统做法是释放连接,而对于连接池则是在容器中,恢复对该connection的包含
注意点: 连接池存在对connection的并发访问,因此对关于connection的操作应该加锁
对比
相同点:无论是缓冲池,对象池还是连接池,最初的设计初衷都是为了增加系统资源的利用率,是系统开销更多的放在具体的请求处理上而不是对象的建立和释放上,既然都是容器,在类的设计上也有很多相似之处,例如:初始化,成员变量的设计等等。
不同点:所谓的不同点也是在相同点具体细化后产生的,例如互斥,同步信号量的定义,连接,线程,缓冲池的复用策略