对象池  优点:  防止过多的创建对象合理利用对象, 缺点: 会有线程阻塞

 

Demo 测试代码

package com.cjcx.pay.obj;


import java.util.Enumeration;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 对象池
 */
public class ObjectPool {

    private int min = 10;

    private int max = 50;

    private Vector objects = null;

    public synchronized void createPool() {
        if (objects != null) {
            return;
        }

        objects = new Vector();
        for (int i = 0; i < min; i++) {
            objects.addElement(new PooledObject(new Obj()));
        }
    }


    /**
     * 获取池对象
     *
     * @return
     */
    public synchronized Object getObject() {
        Object conn = getFreeObject();

        while (conn == null) {
            wait(250);
            conn = getFreeObject();
        }
        return conn;
    }


    private Object getFreeObject() {
        Object obj = findFreeObject();

        if (obj == null) {
            synchronized (this) {
                int cnt = getBusyCount();
                if (cnt == objects.size() && objects.size() < max) {
                    objects.addElement(new PooledObject(new Obj()));
                    obj = findFreeObject();
                }
            }
        }
        return obj;
    }


    /**
     * 遍历Vector池,获取可用对象
     *
     * @return
     */
    private Object findFreeObject() {
        Object obj = null;
        PooledObject pooledObject = null;

        Enumeration enumeration = objects.elements();
        while (enumeration.hasMoreElements()) {
            pooledObject = (PooledObject) enumeration.nextElement();

            if (!pooledObject.isBusy()) {
                obj = pooledObject.getObject();
                pooledObject.setBusy(true);
                break;
            }
        }
        return obj;
    }

    private int getBusyCount() {
        int cnt = 0;
        PooledObject pooledObject = null;
        Enumeration enumeration = objects.elements();
        while (enumeration.hasMoreElements()) {
            pooledObject = (PooledObject) enumeration.nextElement();

            if (pooledObject.isBusy()) {
                cnt++;
            }
        }
        return cnt;
    }


    /**
     * 此函数返回一个对象到对象池中,并把此对象置为空闲。
     * 所有使用对象池获得的对象均应在不使用此对象时返回它。
     */

    public void returnObject(Object obj) {

        // 确保对象池存在,如果对象没有创建(不存在),直接返回
        if (objects == null) {
            return;
        }

        PooledObject pObj = null;
        Enumeration enumerate = objects.elements();

        // 遍历对象池中的所有对象,找到这个要返回的对象对象
        while (enumerate.hasMoreElements()) {
            pObj = (PooledObject) enumerate.nextElement();

            // 先找到对象池中的要返回的对象对象
            if (obj == pObj.getObject()) {
                // 找到了 , 设置此对象为空闲状态
                pObj.setBusy(false);
                break;
            }
        }
    }

    /**
     * 使程序等待给定的毫秒数
     */
    private void wait(int mSeconds) {
        try {
            Thread.sleep(mSeconds);
        } catch (InterruptedException e) {
        }
    }


    /**
     * 关闭对象池中所有的对象,并清空对象池。
     */
    public synchronized void closeObjectPool() {
        // 确保对象池存在,如果不存在,返回
        if (objects == null) {
            return;
        }

        PooledObject pObj = null;
        Enumeration enumerate = objects.elements();
        while (enumerate.hasMoreElements()) {
            pObj = (PooledObject) enumerate.nextElement();
            // 如果忙,等 5 秒
            if (pObj.isBusy()) {
                wait(5000); // 等 5 秒
            }
            // 从对象池向量中删除它
            objects.removeElement(pObj);
        }
        // 置对象池为空
        objects = null;
    }


    public Vector getObjects() {
        return objects;
    }

    public static void main(String[] args) {
        ObjectPool pool = new ObjectPool();
        System.out.println("创建对象池");
        pool.createPool();

        //创建固定线程池 为面延迟回收对象
        ExecutorService executor = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 100; i++) {
            System.out.println(" 对象池 对象数量: " + pool.getObjects().size());

            Obj pObj = (Obj) pool.getObject();
            pObj.syaHello(i);

            //延迟20ms 回收对象
            FutureTask<Void> future =
                    new FutureTask<Void>(new Callable<Void>() {
                        @Override
                        public Void call() throws Exception {
                            Thread.sleep(20);
                            pool.returnObject(pObj);
                            return null;
                        }
                    });
            executor.execute(future);
        }

        System.out.println("清空对象池");
        pool.closeObjectPool();
      //关闭线程池
        executor.shutdown();
    }


    /**
     * 池对象
     */
    class PooledObject {
        Object object = null;
        boolean busy = false;

        public PooledObject() {
        }

        public PooledObject(Object object) {
            this.object = object;
        }

        public Object getObject() {
            return object;
        }

        public void setObject(Object object) {
            this.object = object;
        }

        public boolean isBusy() {
            return busy;
        }

        public void setBusy(boolean busy) {
            this.busy = busy;
        }
    }


    /**
     * 对象 待处理对象
     */
    class Obj {

        public void syaHello(int i) {
            System.out.println(this.toString() + " ==> hello :" + i);
            ;
        }
    }

}

 

运行main方法效果如下;

"C:\Program Files\Java\jdk1.8.0_141\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2\lib\idea_rt.jar=61770:C:\Program Files\JetBrains\IntelliJ IDEA 2017.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_141\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_141\jre\lib\rt.jar;C:\Users\guo\workspace\idea\cloud-dev\mall-pay\target\test-classes;C:\Users\guo\workspace\idea\cloud-dev\mall-pay\target\classes;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\1.5.12.RELEASE\spring-boot-starter-thymeleaf-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.12.RELEASE\spring-boot-starter-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot\1.5.12.RELEASE\spring-boot-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.12.RELEASE\spring-boot-autoconfigure-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.12.RELEASE\spring-boot-starter-logging-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\guo\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\guo\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;C:\Users\guo\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\guo\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;C:\Users\guo\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\guo\.m2\repository\org\thymeleaf\thymeleaf-spring4\3.0.2.RELEASE\thymeleaf-spring4-3.0.2.RELEASE.jar;C:\Users\guo\.m2\repository\org\thymeleaf\thymeleaf\3.0.2.RELEASE\thymeleaf-3.0.2.RELEASE.jar;C:\Users\guo\.m2\repository\org\attoparser\attoparser\2.0.1.RELEASE\attoparser-2.0.1.RELEASE.jar;C:\Users\guo\.m2\repository\org\unbescape\unbescape\1.1.4.RELEASE\unbescape-1.1.4.RELEASE.jar;C:\Users\guo\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\guo\.m2\repository\nz\net\ultraq\thymeleaf\thymeleaf-layout-dialect\2.1.1\thymeleaf-layout-dialect-2.1.1.jar;C:\Users\guo\.m2\repository\org\codehaus\groovy\groovy\2.4.15\groovy-2.4.15.jar;C:\Users\guo\.m2\repository\nz\net\ultraq\thymeleaf\thymeleaf-expression-processor\1.1.2\thymeleaf-expression-processor-1.1.2.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.5.12.RELEASE\spring-boot-starter-web-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.12.RELEASE\spring-boot-starter-tomcat-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.29\tomcat-embed-core-8.5.29.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\tomcat-annotations-api\8.5.29\tomcat-annotations-api-8.5.29.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.29\tomcat-embed-el-8.5.29.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.29\tomcat-embed-websocket-8.5.29.jar;C:\Users\guo\.m2\repository\org\hibernate\hibernate-validator\5.3.6.Final\hibernate-validator-5.3.6.Final.jar;C:\Users\guo\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\guo\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\guo\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\guo\.m2\repository\org\springframework\spring-web\4.3.16.RELEASE\spring-web-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-beans\4.3.16.RELEASE\spring-beans-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-context\4.3.16.RELEASE\spring-context-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-webmvc\4.3.16.RELEASE\spring-webmvc-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-expression\4.3.16.RELEASE\spring-expression-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;C:\Users\guo\.m2\repository\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-test\1.5.12.RELEASE\spring-boot-starter-test-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-test\1.5.12.RELEASE\spring-boot-test-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\1.5.12.RELEASE\spring-boot-test-autoconfigure-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\com\jayway\jsonpath\json-path\2.2.0\json-path-2.2.0.jar;C:\Users\guo\.m2\repository\net\minidev\json-smart\2.2.1\json-smart-2.2.1.jar;C:\Users\guo\.m2\repository\net\minidev\accessors-smart\1.1\accessors-smart-1.1.jar;C:\Users\guo\.m2\repository\org\ow2\asm\asm\5.0.3\asm-5.0.3.jar;C:\Users\guo\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\guo\.m2\repository\org\assertj\assertj-core\2.6.0\assertj-core-2.6.0.jar;C:\Users\guo\.m2\repository\org\mockito\mockito-core\1.10.19\mockito-core-1.10.19.jar;C:\Users\guo\.m2\repository\org\objenesis\objenesis\2.1\objenesis-2.1.jar;C:\Users\guo\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\guo\.m2\repository\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;C:\Users\guo\.m2\repository\org\skyscreamer\jsonassert\1.4.0\jsonassert-1.4.0.jar;C:\Users\guo\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\guo\.m2\repository\org\springframework\spring-core\4.3.16.RELEASE\spring-core-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-test\4.3.16.RELEASE\spring-test-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-aop\1.5.12.RELEASE\spring-boot-starter-aop-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-aop\4.3.16.RELEASE\spring-aop-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;C:\Users\guo\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;C:\Users\guo\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;C:\Users\guo\.m2\repository\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;C:\Users\guo\.m2\repository\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;C:\Users\guo\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\1.5.12.RELEASE\spring-boot-starter-jdbc-1.5.12.RELEASE.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\tomcat-jdbc\8.5.29\tomcat-jdbc-8.5.29.jar;C:\Users\guo\.m2\repository\org\apache\tomcat\tomcat-juli\8.5.29\tomcat-juli-8.5.29.jar;C:\Users\guo\.m2\repository\org\springframework\spring-jdbc\4.3.16.RELEASE\spring-jdbc-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\org\springframework\spring-tx\4.3.16.RELEASE\spring-tx-4.3.16.RELEASE.jar;C:\Users\guo\.m2\repository\com\alibaba\druid\1.0.18\druid-1.0.18.jar;C:\Program Files\Java\jdk1.8.0_141\lib\jconsole.jar;C:\Program Files\Java\jdk1.8.0_141\lib\tools.jar;C:\Users\guo\.m2\repository\com\google\code\gson\gson\2.7\gson-2.7.jar;C:\Users\guo\.m2\repository\org\json\json\20180130\json-20180130.jar;C:\Users\guo\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.3\jackson-core-2.9.3.jar;C:\Users\guo\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.3\jackson-annotations-2.9.3.jar;C:\Users\guo\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.3\jackson-databind-2.9.3.jar;C:\Users\guo\.m2\repository\commons-lang\commons-lang\2.5\commons-lang-2.5.jar;C:\Users\guo\.m2\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;C:\Users\guo\.m2\repository\com\github\pagehelper\pagehelper\4.1.6\pagehelper-4.1.6.jar;C:\Users\guo\.m2\repository\com\github\jsqlparser\jsqlparser\0.9.5\jsqlparser-0.9.5.jar" com.cjcx.pay.obj.ObjectPool
创建对象池
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :0
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :1
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :2
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :3
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@9807454 ==> hello :4
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :5
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :6
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :7
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :8
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :9
 对象池 对象数量: 10
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :10
 对象池 对象数量: 11
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :11
 对象池 对象数量: 12
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :12
 对象池 对象数量: 13
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :13
 对象池 对象数量: 14
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :14
 对象池 对象数量: 15
com.cjcx.pay.obj.ObjectPool$Obj@66a29884 ==> hello :15
 对象池 对象数量: 16
com.cjcx.pay.obj.ObjectPool$Obj@4769b07b ==> hello :16
 对象池 对象数量: 17
com.cjcx.pay.obj.ObjectPool$Obj@cc34f4d ==> hello :17
 对象池 对象数量: 18
com.cjcx.pay.obj.ObjectPool$Obj@17a7cec2 ==> hello :18
 对象池 对象数量: 19
com.cjcx.pay.obj.ObjectPool$Obj@65b3120a ==> hello :19
 对象池 对象数量: 20
com.cjcx.pay.obj.ObjectPool$Obj@6f539caf ==> hello :20
 对象池 对象数量: 21
com.cjcx.pay.obj.ObjectPool$Obj@79fc0f2f ==> hello :21
 对象池 对象数量: 22
com.cjcx.pay.obj.ObjectPool$Obj@50040f0c ==> hello :22
 对象池 对象数量: 23
com.cjcx.pay.obj.ObjectPool$Obj@2dda6444 ==> hello :23
 对象池 对象数量: 24
com.cjcx.pay.obj.ObjectPool$Obj@5e9f23b4 ==> hello :24
 对象池 对象数量: 25
com.cjcx.pay.obj.ObjectPool$Obj@4783da3f ==> hello :25
 对象池 对象数量: 26
com.cjcx.pay.obj.ObjectPool$Obj@378fd1ac ==> hello :26
 对象池 对象数量: 27
com.cjcx.pay.obj.ObjectPool$Obj@49097b5d ==> hello :27
 对象池 对象数量: 28
com.cjcx.pay.obj.ObjectPool$Obj@6e2c634b ==> hello :28
 对象池 对象数量: 29
com.cjcx.pay.obj.ObjectPool$Obj@37a71e93 ==> hello :29
 对象池 对象数量: 30
com.cjcx.pay.obj.ObjectPool$Obj@7e6cbb7a ==> hello :30
 对象池 对象数量: 31
com.cjcx.pay.obj.ObjectPool$Obj@7c3df479 ==> hello :31
 对象池 对象数量: 32
com.cjcx.pay.obj.ObjectPool$Obj@7106e68e ==> hello :32
 对象池 对象数量: 33
com.cjcx.pay.obj.ObjectPool$Obj@7eda2dbb ==> hello :33
 对象池 对象数量: 34
com.cjcx.pay.obj.ObjectPool$Obj@6576fe71 ==> hello :34
 对象池 对象数量: 35
com.cjcx.pay.obj.ObjectPool$Obj@76fb509a ==> hello :35
 对象池 对象数量: 36
com.cjcx.pay.obj.ObjectPool$Obj@300ffa5d ==> hello :36
 对象池 对象数量: 37
com.cjcx.pay.obj.ObjectPool$Obj@1f17ae12 ==> hello :37
 对象池 对象数量: 38
com.cjcx.pay.obj.ObjectPool$Obj@4d405ef7 ==> hello :38
 对象池 对象数量: 39
com.cjcx.pay.obj.ObjectPool$Obj@6193b845 ==> hello :39
 对象池 对象数量: 40
com.cjcx.pay.obj.ObjectPool$Obj@2e817b38 ==> hello :40
 对象池 对象数量: 41
com.cjcx.pay.obj.ObjectPool$Obj@c4437c4 ==> hello :41
 对象池 对象数量: 42
com.cjcx.pay.obj.ObjectPool$Obj@433c675d ==> hello :42
 对象池 对象数量: 43
com.cjcx.pay.obj.ObjectPool$Obj@3f91beef ==> hello :43
 对象池 对象数量: 44
com.cjcx.pay.obj.ObjectPool$Obj@1a6c5a9e ==> hello :44
 对象池 对象数量: 45
com.cjcx.pay.obj.ObjectPool$Obj@37bba400 ==> hello :45
 对象池 对象数量: 46
com.cjcx.pay.obj.ObjectPool$Obj@179d3b25 ==> hello :46
 对象池 对象数量: 47
com.cjcx.pay.obj.ObjectPool$Obj@254989ff ==> hello :47
 对象池 对象数量: 48
com.cjcx.pay.obj.ObjectPool$Obj@5d099f62 ==> hello :48
 对象池 对象数量: 49
com.cjcx.pay.obj.ObjectPool$Obj@37f8bb67 ==> hello :49
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :50
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :51
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :52
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :53
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@9807454 ==> hello :54
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :55
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :56
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :57
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :58
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :59
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :60
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :61
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :62
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :63
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :64
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@66a29884 ==> hello :65
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4769b07b ==> hello :66
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@cc34f4d ==> hello :67
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@17a7cec2 ==> hello :68
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@65b3120a ==> hello :69
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@6f539caf ==> hello :70
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@79fc0f2f ==> hello :71
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@50040f0c ==> hello :72
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@2dda6444 ==> hello :73
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@5e9f23b4 ==> hello :74
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4783da3f ==> hello :75
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@378fd1ac ==> hello :76
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@49097b5d ==> hello :77
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@6e2c634b ==> hello :78
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@37a71e93 ==> hello :79
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7e6cbb7a ==> hello :80
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7c3df479 ==> hello :81
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7106e68e ==> hello :82
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7eda2dbb ==> hello :83
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@6576fe71 ==> hello :84
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :85
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :86
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :87
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :88
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@9807454 ==> hello :89
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :90
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :91
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :92
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :93
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :94
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :95
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :96
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :97
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :98
 对象池 对象数量: 50
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :99
清空对象池

Process finished with exit code 0

 

可见对象重复利用了,

 

posted on 2018-09-10 15:58  1161588342  阅读(234)  评论(0编辑  收藏  举报