1. 程式人生 > >SimpleDateFormatPool日期格式化類池工具(執行緒安全)

SimpleDateFormatPool日期格式化類池工具(執行緒安全)

轉載請註明出處: 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;
		}
	}
}