SimpleDateFormatPool日期格式化類池工具(執行緒安全)
阿新 • • 發佈:2018-12-15
轉載請註明出處: https://blog.csdn.net/jevonsCSDN/article/details/83092795 【Jevons’Blog】 SimpleDateFormat是一個非執行緒安全類,當高併發時,若共用一個format物件,則會出現執行緒安全問題,比如前一個format結果會被後一個format結果頂掉,這不符合我們的預期;而如果每用一次就new一次,當使用頻率高時卻又會造成非常大的開銷,這種結果更不理想,所以寫了個執行緒安全的類池,用本人的老爺機實測10萬併發耗時6秒左右,SimpleDateFormat物件維持在30-60之間,格式池設定最大值為50,基本滿足要求。
import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import java.util.Vector; /** * 日期格式化類池(執行緒安全) * @author Zhang HaoWen * @date 2018年10月12日 */ public class SimpleDateFormatPoolKit { private static final Map<PatternType, Vector<SimpleDateFormatSub>> TYPE_MAP = new HashMap<PatternType, Vector<SimpleDateFormatSub>>(); private SimpleDateFormatPoolKit(){}; private static final int maxSize = 0x32;//格式池最大值:50 static { for(PatternType patternType: PatternType.values()){ TYPE_MAP.put(patternType, new Vector<SimpleDateFormatSub>()); } } public static synchronized SimpleDateFormatSub getFormator(PatternType patternType){ if(TYPE_MAP.get(patternType).size()==0){ return new SimpleDateFormatSub(patternType); }else{ return TYPE_MAP.get(patternType).remove(0); } } public static synchronized SimpleDateFormatSub getFormator(){ return getFormator(PatternType.values()[0]);//default } public static synchronized void free(SimpleDateFormatSub sdf){ if(TYPE_MAP.get(sdf.getPatternType()).size()<maxSize){ TYPE_MAP.get(sdf.getPatternType()).add(sdf); } } public static class SimpleDateFormatSub extends SimpleDateFormat{ private static final long serialVersionUID = 1L; private PatternType patternType; public SimpleDateFormatSub(PatternType patternType) { super.applyPattern(patternType.toString());; this.setPatternType(patternType); } public PatternType getPatternType() { return patternType; } public void setPatternType(PatternType patternType) { this.patternType = patternType; } } public enum PatternType{ YEAR_TO_DAY ("yyyy-MM-dd"), YEAR_TO_SECOND ("yyyy-MM-dd HH:mm:ss"); private String patternValue; private PatternType(String patternValue) { this.patternValue=patternValue; } @Override public String toString() { return this.patternValue; } } }