Mega Code Archive

 
Categories / Java Tutorial / Collections
 

Simple object pool

/*  *  Licensed to the Apache Software Foundation (ASF) under one or more  *  contributor license agreements.  See the NOTICE file distributed with  *  this work for additional information regarding copyright ownership.  *  The ASF licenses this file to You under the Apache License, Version 2.0  *  (the "License"); you may not use this file except in compliance with  *  the License.  You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  *  Unless required by applicable law or agreed to in writing, software  *  distributed under the License is distributed on an "AS IS" BASIS,  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  *  See the License for the specific language governing permissions and  *  limitations under the License.  */ /**  * Simple object pool. Based on ThreadPool and few other classes  *   * The pool will ignore overflow and return null if empty.  *   * @author Gal Shachor  * @author Costin Manolache  */ public final class SimplePool {   /*    * Where the threads are held.    */   private Object pool[];   private int max;   private int last;   private int current = -1;   private Object lock;   public static final int DEFAULT_SIZE = 32;   static final int debug = 0;   public SimplePool() {     this(DEFAULT_SIZE, DEFAULT_SIZE);   }   public SimplePool(int size) {     this(size, size);   }   public SimplePool(int size, int max) {     this.max = max;     pool = new Object[size];     this.last = size - 1;     lock = new Object();   }   public void set(Object o) {     put(o);   }   /**    * Add the object to the pool, silent nothing if the pool is full    */   public void put(Object o) {     synchronized (lock) {       if (current < last) {         current++;         pool[current] = o;       } else if (current < max) {         // realocate         int newSize = pool.length * 2;         if (newSize > max)           newSize = max + 1;         Object tmp[] = new Object[newSize];         last = newSize - 1;         System.arraycopy(pool, 0, tmp, 0, pool.length);         pool = tmp;         current++;         pool[current] = o;       }     }   }   /**    * Get an object from the pool, null if the pool is empty.    */   public Object get() {     Object item = null;     synchronized (lock) {       if (current >= 0) {         item = pool[current];         pool[current] = null;         current -= 1;       }     }     return item;   }   /**    * Return the size of the pool    */   public int getMax() {     return max;   }   /**    * Number of object in the pool    */   public int getCount() {     return current + 1;   }   public void shutdown() {   } }