• 关于对象池技术的一些记录


    关于对象池技术的一些记录
    线程池和数据库连接池是比较常见的对象池的实现,之所以想起来写这个东西,是因为,在看Java编程思想的时候,看到是使用信号量来实现的一个通用的简单的对象池的实现,之后,又看了apache的commons-pool的实现,所以记录一下实现一个对象池,就需要主要哪一些东西.

    Java编程思想中提供的一种基于信号量的简单的对象池,代码如下:

    package com.jiaoyiping.baseproject.pool;
    
    import com.jiaoyiping.baseproject.thrift.Hello;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.Semaphore;
    
    /**
     * Created with Intellij IDEA
     *
     * @author: jiaoyiping
     * Mail: jiaoyiping@gmail.com
     * Date: 2018/04/01
     * Time: 21:04
     * To change this template use File | Settings | Editor | File and Code Templates
     */
    //Java编程思想中的线程池的实现
    public class ThinkingInJavaPool<T> {
        private Semaphore semaphore;
        private int size;
        private boolean[] marks;
        private List<T> data = new ArrayList<>();
    
        public ThinkingInJavaPool(int size, Class<T> dataType) {
            this.size = size;
            this.semaphore = new Semaphore(size);
            marks = new boolean[size];
            for (int i = 0; i < size; i++) {
                try {
                    data.add((T) dataType.newInstance());
                    marks[i] = false;
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public T get() {
            try {
                semaphore.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (marks) {
                for (int i = 0; i < size; i++) {
                    if (marks[i] == false) {
                        marks[i] = true;
                        return data.get(i);
                    }
    
                }
    
            }
            //this will never happen
            return null;
        }
    
        public void release(T t) {
            synchronized (marks) {
                int index = data.indexOf(t);
                if (marks[index] == true) {
                    marks[index] = false;
                }
            }
            semaphore.release();
        }
    }    
    

    另外一种通用的并发的对象池的实现,参考文章:
    http://ifeve.com/generic-concurrent-object-pool/
    Apache中的commons-pool项目的对象池实现的一些思路(项目的地址参考这里https://commons.apache.org/proper/commons-pool/):
    1.使用工厂方法来进行对象的初始化(通常一个通用的对象池的实现,都需要考虑对象的创建的问题)
    2.使用了通用的对象池的实现和key-value的对象池的实现
    3.可以自己定义对象池中的对象的配置(最大最小数值,和空闲时间等等)和对象的淘汰的策略
    4.可以选择自己实现commons-pool提供的接口,来实现自己的对象池
    5.使用commons-pool的默认实现应该已经能够满足我们的要求了

  • 相关阅读:
    linux 后台启动 nodejs httpserver
    Abp vNext获取Token
    git log 修改date显示格式
    解决Visual Studio关闭后马上删除项目无法删除的问题
    Docker DeskTop 起不来啦,Docker 报错
    (笔记)电磁兼容之差模噪声与共模噪声(第四讲)
    (笔记)电磁兼容之差模与共模辐射场强计算公式(第五讲)
    mysql使用存储过程批量给表加字段
    基于gradle的Groovy之Spock测试框架入门三
    基于gradle的Groovy之Spock测试框架入门一
  • 原文地址:https://www.cnblogs.com/jiaoyiping/p/8586378.html
Copyright © 2020-2023  润新知