JavaEE:代码简单优化

一、使用对象池:

说明:
复用对象,降低频繁创建/回收对象的性能损耗。

1.自定义简单对象池:

public class ObjectPool<T> {//自定义简单对象池
    private static ObjectPool mInstance;
    private final int Default_SIZE = 100;
    private int mMaxSize = Default_SIZE; //对象最大个数
    private static final String LOCK = "ObjectPool";
    //活跃对象
    private Set<T> mActiveObjs = Collections.synchronizedSet(new HashSet<>());
    //闲置对象
    private Set<T> mIdleObjs = Collections.synchronizedSet(new HashSet<>());
    private ObjectPool(int maxSize) {
        if (maxSize > 0) mMaxSize = maxSize;
    }
    public static ObjectPool I() {
        return I(-1);
    }
    public static ObjectPool I(int maxSize) {
        synchronized (LOCK) {
            if (mInstance == null) mInstance = new ObjectPool(maxSize);
            return mInstance;
        }
    }
    public synchronized T obtain(Class<T> clazz) throws Exception {//获取对象
        T obj;
        if (!mIdleObjs.isEmpty()) {//从对象池拿对象
            obj = mIdleObjs.iterator().next();
            mIdleObjs.remove(obj);
            mActiveObjs.add(obj);
            return obj;
        }
        if ((mActiveObjs.size() + mIdleObjs.size()) <= mMaxSize) {//创建新对象并存入池中
            obj = (T) clazz.getMethod("init").invoke(clazz);
            mActiveObjs.add(obj);
            return obj;
        }
        try {//阻塞线程
            synchronized (LOCK) {
                LOCK.wait();
            }
        } catch (Exception e) {
            throw new Exception("获取对象异常");
        }
        return obtain(clazz);
    }
    public synchronized void Obj(T obj) throws Exception {归还对象
        if (obj == null) return;
        try {//归还对象并唤醒其他等待中的线程
            mActiveObjs.remove(obj);
            mIdleObjs.add(obj);
            synchronized (LOCK) {
                LOCK.notify();
            }
        } catch (Exception e) {
            throw new Exception("归还对象异常");
        }
    }
}

2.Commons-Pool2对象池:

(1)API说明:

ObjectPool分类:

GenericObjectPool/GenericKeyedObjectPool:通用对象池
BaseObjectPool:抽象类,用于自定义对象池
ErodingObjectPool/ErodingKeyedObjectPool:归还对象后,对象被丢弃
ProxiedObjectPool/ProxiedKeyedObjectPool:代理对象池,获取代理对象
SoftReferenceObjectPool:软引用对象池
SynchronizedObjectPool/SynchronizedKeyedObjectPool:线程安全对象池

ObjectPool方法:

borrowObject:获取对象
returnObject:归还对象
invalidateObject:丢弃对象
addObject:增加空闲对象
clear:清空所有空闲对象
close:释放对象池
getNumActive:获取活动对象个数
getNumIdle:获取空闲对象个数

PooledObject分类:

DeffaultPooledObject:包装对象,监控对象创建/使用时间、状态等
PooledSoftReference:基于DeffaultPooledObject,配合SoftReferenceObjectPool使用

PooledObject状态:

IDLE:空闲对象
ALLOCATED:活跃对象
EVICTION:对象在驱逐测试
EVICTION_RETURN_TO_HEAD:驱逐测试成功,对象移到队列顶部
VALIDATION:空闲对象校验中
VALIDATION_PREALLOCATED:(池外)对象获取时校验中
VALIDATION_RETURN_TO_HEAD:(池外)对象校验成功后移到队列顶部
ABANDONED:(池内)对象放逐中,将会变成INVALID
INVALID:对象失效/驱逐测试失败/校验失败/销毁
RETURNING:对象归还中

GenericObjectPoolConfig配置:

softMinEvictableIdleTimeMillis:同minEvictableIdleTimeMillis,默认-1
testOnBorrow:出借前有效性测试,默认false
testOnCreate:创建后有效性测试,默认false
testOnReturn:归还前有效性测试,默认false
testWhileIdle:空闲有效性测试(timeBetweenEvictionRunsMillis>0生效),默认false
timeBetweenEvictionRunsMillis:定时器周期,值>0时创建定时器,默认-1

GenericObjectPoolConfig配置(GenericObjectPool构造第2参数):

setMaxTotal(8):对象总数,默认8
setMaxIdle(8):最大空闲对象数,默认8
setMinIdle(0):最小空闲对象数,默认0
setLifo(true):(默认)true对象池后进先出,false先进先出
setMaxWait(Duration.ofMillis(-1)):取对象阻塞时最大等待时间,默认-1无限时
setMinEvictableIdleTime(Duration.ofMillis(1800000L)):设置对象允许空闲的最小时间,默认1800000L
setNumTestsPerEvictionRun(3):每次驱逐数量,默认3

AbandonedConfig配置(GenericObjectPool构造第3参数):

setLogAbandoned(false):true应用在废弃,默认false
setLogWriter(PrintWriter):日志打印组件,默认System.out
setRemoveAbandonedOnBorrow(false):true借用对象时移除废弃对象,默认false
setRemoveAbandonedOnMaintenance(false):true当removeAbandonedTimeout时间到了后移除对象(timeBetweenEvictionRunsMillis>0生效),默认false
setRemoveAbandonedTimeout(Duration.ofMinutes(5L)):废弃对象移除等待时间,默认5秒
setRequireFullStackTrace(true):logAbandoned为true时输出完整栈信息,默认true
setUseUsageTracking(false):记录并保留最新栈跟踪信息,默认false

Abandon与Evict区别:

Abandon:(池内)对象放逐中的状态
Evict:清理ABANDONED/INVALID状态对象的过程

(2)使用:

添加commons-pool2依赖:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值