diff --git a/src/org/redkale/util/ObjectPool.java b/src/org/redkale/util/ObjectPool.java index d0a4aab40..8530dcc84 100644 --- a/src/org/redkale/util/ObjectPool.java +++ b/src/org/redkale/util/ObjectPool.java @@ -39,7 +39,10 @@ public class ObjectPool implements Supplier, Consumer { protected final Queue queue; - protected ObjectPool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator creator, Consumer prepare, Predicate recycler, Queue queue) { + protected final ObjectPool parent; + + protected ObjectPool(ObjectPool parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator creator, Consumer prepare, Predicate recycler, Queue queue) { + this.parent = parent; this.creatCounter = creatCounter; this.cycleCounter = cycleCounter; this.creator = creator; @@ -82,7 +85,42 @@ public class ObjectPool implements Supplier, Consumer { //非线程安全版 public static ObjectPool createUnsafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator creator, Consumer prepare, Predicate recycler) { - return new ObjectPool(creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), + return createUnsafePool(null, creatCounter, cycleCounter, max, creator, prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, Class clazz, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, 2, clazz, prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, int max, Class clazz, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, max, Creator.create(clazz), prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, Creator creator, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, 2, creator, prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, int max, Creator creator, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, null, null, max, creator, prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, int max, Supplier creator, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, null, null, max, creator, prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Supplier creator, Consumer prepare, Predicate recycler) { + return createUnsafePool(parent, creatCounter, cycleCounter, max, c -> creator.get(), prepare, recycler); + } + + //非线程安全版 + public static ObjectPool createUnsafePool(ObjectPool parent, AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator creator, Consumer prepare, Predicate recycler) { + return new ObjectPool(parent, creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), creator, prepare, recycler, new ArrayDeque<>(Math.max(Runtime.getRuntime().availableProcessors(), max))); } @@ -118,7 +156,7 @@ public class ObjectPool implements Supplier, Consumer { //线程安全版 public static ObjectPool createSafePool(AtomicLong creatCounter, AtomicLong cycleCounter, int max, Creator creator, Consumer prepare, Predicate recycler) { - return new ObjectPool(creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), + return new ObjectPool(null, creatCounter, cycleCounter, Math.max(Runtime.getRuntime().availableProcessors(), max), creator, prepare, recycler, new LinkedBlockingQueue<>(Math.max(Runtime.getRuntime().availableProcessors(), max))); } @@ -155,7 +193,8 @@ public class ObjectPool implements Supplier, Consumer { T result = queue.poll(); if (result == null) { if (creatCounter != null) creatCounter.incrementAndGet(); - result = this.creator.create(); + if (parent != null) result = parent.queue.poll(); + if (result == null) result = this.creator.create(); } if (prepare != null) prepare.accept(result); return result; @@ -163,7 +202,8 @@ public class ObjectPool implements Supplier, Consumer { @Override public void accept(final T e) { - if (e != null && recycler.test(e)) { + if (e == null) return; + if (recycler.test(e)) { if (cycleCounter != null) cycleCounter.incrementAndGet(); // if (debug) { // for (T t : queue) { @@ -173,7 +213,7 @@ public class ObjectPool implements Supplier, Consumer { // } // } // } - queue.offer(e); + if (!queue.offer(e) && parent != null) parent.accept(e); } }