读书人

让DateFormat多线程保险

发布时间: 2012-11-18 10:51:21 作者: rapoo

让DateFormat多线程安全
"DateFormat 不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须保持外部同步。"----摘自JDK文档中文版

首先让我们看看一个简单的方法

import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.Map;public class DateFormatFactory {private static final Map<String, ThreadLocal<SimpleDateFormat>> pool = new HashMap<String, ThreadLocal<SimpleDateFormat>>();private static final Object lock = new Object();public static SimpleDateFormat getDateFormat(String pattern) {ThreadLocal<SimpleDateFormat> tl = pool.get(pattern);if (tl == null) {synchronized (lock) {tl = pool.get(pattern);if (tl == null) {final String p = pattern;tl = new ThreadLocal<SimpleDateFormat>() {protected synchronized SimpleDateFormat initialValue() {return new SimpleDateFormat(p);}};pool.put(p, tl);}}}return tl.get();}}public static Date toDate(String dateStr,String pattern) {try{return getDateFormat(pattern).parse(dateStr);}catch (ParseException e) {}return null;}

上面还增加了对不同Pattern的ThreadLocal的缓存,这样对于每一个线程每一种pattern都只要创建一个SimpleDateFormat对象,多线程访问无需争用。

代码还要很多待改进的地方,如对于非法的pattern不要缓存,是否存在更快、更节约内存的方法。。。。。。
匆匆忙忙,如有错误的地方望不吝赐教!

读书人网 >编程

热点推荐