All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kaka.util.ObjectPool Maven / Gradle / Ivy

package com.kaka.util;

import com.kaka.util.ObjectPool.Poolable;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 对象池
 *
 * @param  可闲置对象类型
 * @author zkpursuit
 */
abstract public class ObjectPool {

    /**
     * 可池化的对象最大数量
     */
    public final int max;
    /**
     * 闲置对象数量峰值
     */
    private int peak;
    /**
     * 对象存储队列
     */
    private Queue freeObjects;

    /**
     * 构造方法
     */
    public ObjectPool() {
        this(Integer.MAX_VALUE);
    }

    /**
     * 构造方法
     *
     * @param max 对象池中可缓存的最大池化对象
     */
    public ObjectPool(int max) {
        this.max = max;
        if (this.max > 0) {
            freeObjects = this.initQueue(max);
        }
    }

    /**
     * 初始化对象池存储队列
     *
     * @param initialCapacity 队列初始化大小
     * @return 对象池队列
     */
    protected Queue initQueue(int initialCapacity) {
        return new ConcurrentLinkedQueue<>();
    }

    /**
     * 创建新的可池化对象
     *
     * @return 新对象
     */
    abstract protected T newObject();

    /**
     * 从池中取出一个可用对象
     *
     * @return 可用对象
     */
    public T obtain() {
        return (freeObjects == null || freeObjects.isEmpty()) ? newObject() : freeObjects.poll();
    }

    /**
     * 将对象闲置并放入对象池
     *
     * @param object 需要闲置的对象
     */
    public void idle(T object) {
        if (max <= 0) {
            return;
        }
        if (object == null) {
            throw new IllegalArgumentException("object cannot be null.");
        }
        this.reset(object);
        if (freeObjects != null) {
            int idleCount = freeObjects.size();
            if (idleCount < max) {
                freeObjects.add(object);
                peak = Math.max(peak, idleCount + 1);
            }
        }
    }

    /**
     * 重置对象
     *
     * @param object 待重置放入对象池的对象
     */
    protected void reset(T object) {
        object.reset();
    }

    /**
     * 清除对象池中的所有数据
     */
    public void clear() {
        if (freeObjects != null) {
            freeObjects.clear();
        }
    }

    /**
     * 获取对象池中的闲置对象总数
     *
     * @return 闲置对象总数
     */
    public int getIdleCount() {
        if (freeObjects != null) {
            return freeObjects.size();
        }
        return 0;
    }

    /**
     * 可池化对象数量的最大值
     *
     * @return 最大池化数量
     */
    public int max() {
        return this.max;
    }

    /**
     * 池中闲置对象数量的峰值
     * 
* 此值添加volatile修饰,为了尽可能的增加并发性能,故对此值未加锁控制,因 此不一定完全真实,一般情况,我们不一定用到此值。 *
* 如需具有真实的参考,请改写源码自行对此值加锁,建议使用jdk8的StampedLock * * @return 闲置对象数量的峰值 */ public int peak() { return this.peak; } /** * 可池化对象接口 */ public interface Poolable { /** * 重置对象数据,保障下次使用时为初始化状态 */ void reset(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy