SimpleDateFormat 转为线程安全
2015-06-29 11:04
363 查看
多线程调用是会报错。
解决方案:
/**
* 将字符串转换为日期(与时间)
*/
public static Date parseDatetime(String datetime) throws BusinessException {
try {
if (datetime.indexOf(' ') > 0) {
return getSdf("yyyy-MM-dd HH:mm:ss").parse(datetime);
} else {
return getSdf("yyyy-MM-dd").parse(datetime);
}
} catch (Exception e) {
e.printStackTrace();
throw new BusinessException(ResultMsg.BEAN_COPY_EXCEPTION, "日期字符串格式错误:" + datetime);
}
}
/**
* 返回一个ThreadLocal的sdf,每个线程只会new一次sdf
*/
public static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
if (tl == null) {
synchronized (lockObj) {
tl = sdfMap.get(pattern);
if (tl == null) {
tl = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat(pattern);
}
};
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
/** 锁对象 */
private static final Object lockObj = new Object();
/** 存放不同的日期模板格式的sdf的Map */
private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
解决方案:
/**
* 将字符串转换为日期(与时间)
*/
public static Date parseDatetime(String datetime) throws BusinessException {
try {
if (datetime.indexOf(' ') > 0) {
return getSdf("yyyy-MM-dd HH:mm:ss").parse(datetime);
} else {
return getSdf("yyyy-MM-dd").parse(datetime);
}
} catch (Exception e) {
e.printStackTrace();
throw new BusinessException(ResultMsg.BEAN_COPY_EXCEPTION, "日期字符串格式错误:" + datetime);
}
}
/**
* 返回一个ThreadLocal的sdf,每个线程只会new一次sdf
*/
public static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal<SimpleDateFormat> tl = sdfMap.get(pattern);
if (tl == null) {
synchronized (lockObj) {
tl = sdfMap.get(pattern);
if (tl == null) {
tl = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat(pattern);
}
};
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
/** 锁对象 */
private static final Object lockObj = new Object();
/** 存放不同的日期模板格式的sdf的Map */
private static Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- c#实现多线程局域网聊天系统
- PHP使用CURL实现多线程抓取网页
- 浅解关于C#多线程的介绍
- 批处理程序中的“多线程”处理代码
- c#中多线程访问winform控件的若干问题小结
- C#中的多线程多参数传递详解
- nodejs中使用多线程编程的方法实例