Java 基础 - 对象池
对象池 优点: 防止过多的创建对象合理利用对象, 缺点: 会有线程阻塞
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 = ; private int max = ; private Vector objects = null; public synchronized void createPool() {
if (objects != null) {
return;
} objects = new Vector();
for (int i = ; i < min; i++) {
objects.addElement(new PooledObject(new Obj()));
}
} /**
* 获取池对象
*
* @return
*/
public synchronized Object getObject() {
Object conn = getFreeObject(); while (conn == null) {
wait();
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 = ;
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(); // 等 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(); for (int i = ; i < ; 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();
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- -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
创建对象池
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@ ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@66a29884 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4769b07b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@cc34f4d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@17a7cec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@65b3120a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6f539caf ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@79fc0f2f ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@50040f0c ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@2dda6444 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5e9f23b4 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4783da3f ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@378fd1ac ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@49097b5d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6e2c634b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@37a71e93 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7e6cbb7a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7c3df479 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7106e68e ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7eda2dbb ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6576fe71 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@76fb509a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@300ffa5d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1f17ae12 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4d405ef7 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6193b845 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@2e817b38 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@c4437c4 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@433c675d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3f91beef ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1a6c5a9e ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@37bba400 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@179d3b25 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@254989ff ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5d099f62 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@37f8bb67 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@ ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@66a29884 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4769b07b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@cc34f4d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@17a7cec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@65b3120a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6f539caf ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@79fc0f2f ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@50040f0c ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@2dda6444 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5e9f23b4 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4783da3f ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@378fd1ac ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@49097b5d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6e2c634b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@37a71e93 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7e6cbb7a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7c3df479 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7106e68e ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7eda2dbb ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@6576fe71 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@5b6f7412 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7530d0a ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3941a79c ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4fca772d ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@ ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@3d494fbf ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1ddc4ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@133314b ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@b1bc7ed ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@7cd84586 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@30dae81 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1b2c6ec2 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@4edde6e5 ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@70177ecd ==> hello :
对象池 对象数量:
com.cjcx.pay.obj.ObjectPool$Obj@1e80bfe8 ==> hello :
清空对象池 Process finished with exit code
可见对象重复利用了,
Java 基础 - 对象池的更多相关文章
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- 《java基础——对象的拷贝》
java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...
- JAVA基础—线程池
推荐文章java多线程基础 线程池概述 为什么要使用线程池 1.服务器创建和销毁工作线程的开销很大 2.如果频繁的创建和销毁线程会导致频繁的切换线程,因为一个线程被销毁后,必然要把CPU转让给另一个已 ...
- Java基础-常量池
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- Java之对象池
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
- Java反射---对象池
在很多Java EE 框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是i某个类的字符串类名,程序就需要根据该字符串来创建对应的实例,就必须使用反射. 下面程序就实现了一个简单的对 ...
- Java基础--对象的克隆
文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...
- java基础-对象的初始化
一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...
- java基础——线程池
第2章 线程池 2.1 线程池概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源. 我们详细的解释一下为什么要使用线程池 ...
随机推荐
- PAT 乙级 1062 最简分数(20) C++版
1062. 最简分数(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 一个分数一般写成两个整数相除的形式: ...
- 【ZZ】终于有人把云计算、大数据和人工智能讲明白了!
终于有人把云计算.大数据和人工智能讲明白了! https://mp.weixin.qq.com/s/MqBP0xziJO-lPm23Bjjh9w 很不错的文章把几个概念讲明白了...图片拷不过来... ...
- php的语法
常量:不变的量: php 设置常量的方法:define()方法: define("常量名","常量的值",true) 参数三:大小写是否敏感: php中的常量, ...
- Selector空轮询处理(转载)
https://www.cnblogs.com/my_life/articles/5556939.html Selector空轮询处理 在NIO中通过Selector的轮询当前是否有IO事件,根据JD ...
- win10 专业版 git bash 闪退问题终极解决方案
问题描述 Win10 64位专业版安装git 2.x之后出现 Git闪退,安装1.x出现bash: /dev/null: No such device or address fatal: open / ...
- SqlServer查询中使用事务
--获取一个新的ID declare @newId bigint select @newId=MAX(ID) from BdRdRecord01 begin tran or @newId is nul ...
- servlet简单的小例子
去我云盘下载: https://pan.baidu.com/s/1E2yoZ2Nmk2FE2XjuPOCvjA 访问方式:http://localhost:8080/testServlet/index ...
- [UE4]客户端-服务器模式
客户端负责表现.服务器端负责数据. 以掉血为例: 一.玩家A砍了B一刀 二.服务器计算伤害,修改B的血量 三.把B的血量发给B,A砍B的动作发给所有能看到的玩家 四.客户端播放掉血量(如果允许可见), ...
- [UE4]Actor的Destroyed事件
- CentOS安装Git,并上传、下载
转自:https://blog.csdn.net/u014066037/article/details/70224780 Git 一.安装Git $ yum install git 二. 生成SSH密 ...