package org.springside.modules.utils.text;
/**
* 参考Netty的InternalThreadLocalMap 与 BigDecimal, 放在threadLocal中重用的StringBuilder, 节约StringBuilder内部的char[]
*
* 参考文章:《StringBuilder在高性能场景下的正确用法》http://calvin1978.blogcn.com/articles/stringbuilder.html
*
* 不过仅在String对象较大时才有明显效果,否则抵不上访问ThreadLocal的消耗.
*
* 当StringBuilder在使用过程中,会调用其他可能也使用StringBuilderHolder的子函数时,需要创建独立的Holder, 否则使用公共的Holder
*
* 注意:在Netty环境中,使用Netty提供的基于FastThreadLocal的版本。
*
*/
public class StringBuilderHolder {
// 公共的Holder
private static ThreadLocal<StringBuilder> globalStringBuilder = new ThreadLocal<StringBuilder>() {
@Override
protected StringBuilder initialValue() {
return new StringBuilder(512);
}
};
// 独立的Holder
private ThreadLocal<StringBuilder> stringBuilder = new ThreadLocal<StringBuilder>() {
@Override
protected StringBuilder initialValue() {
return new StringBuilder(initSize);
}
};
private int initSize;
/**
* 创建独立的Holder.
*
* 用于StringBuilder在使用过程中,会调用其他可能也使用StringBuilderHolder的子函数.
*
* @param initSize StringBulder的初始大小, 建议512,如果容量不足将进行扩容,扩容后的数组将一直保留.
*/
public StringBuilderHolder(int initSize) {
this.initSize = initSize;
}
/**
* 获取公共Holder的StringBuilder.
*
* 当StringBuilder会被连续使用,期间不会调用其他可能也使用StringBuilderHolder的子函数时使用.
*
* 重置StringBuilder内部的writerIndex, 而char[]保留不动.
*/
public static StringBuilder getGlobal() {
StringBuilder sb = globalStringBuilder.get();
sb.setLength(0);
return sb;
}
/**
* 获取独立Holder的StringBuilder.
*
* 重置StringBuilder内部的writerIndex, 而char[]保留不动.
*/
public StringBuilder get() {
StringBuilder sb = stringBuilder.get();
sb.setLength(0);
return sb;
}
}