转自自己的博客:http://onedear.cn/entry/dateFormat_synchronized.html
最近一个系统总是会出现一些异常数据。那个系统处理逻辑不复杂。这里用自己的话语大致描述下:系统在数据处理时用上了key-value缓存框架,由于 数据需要时效性,于是用系统名+时间做组合key,例如原有系统名是“system”,那加上时间的key是:system20100101
12:00:00 .时间是精确到小时的,这里调用的方法是key = "system"+
DateUtil.dateToString(DateUtil.getDayTIme(date));
这里贴下自己精简后的util类
/**
* @author onedear
*
*/
public final class DateUtil {
private static DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static String dateToString(Date date) {
return sdf.format(date);
}
/**
* 返回天key
* @return
*/
public static Date getDayTime(Date date) {
Calendar cal = new GregorianCalendar();
cal.setTime(date);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
}
但在实际跑的时候,这个组合key总会出现一点不可思议的数据:
如 system20100101 12:12:13 ,时间竟然不是精确到小时!
由于系统是多线程跑,发现问题总是要花费很多时间,在写了n多log后,发现可能是DateUtil工具类出现问题。
这个工具类是很久之前写的,一直没发现有什么问题。但问题明明就出现在这里,最终查jdk的DateFormat说明,发现dateFormat不是线程安全的:
Synchronization
Date formats are not synchronized. It is recommended to create separate
format instances for each thread. If multiple threads access a format
concurrently, it must be synchronized externally.
那异常数据肯定是被其他线程修改了,最后改成
public static synchronized String dateToString(Date date) {
return sdf.format(date);
}
系统正常跑动。困扰几天的问题总算解决了!
分享到:
相关推荐
NULL 博文链接:https://zhaoshunxin.iteye.com/blog/1291905
调用该类中的方法,实现字符串于日期类型之间的转换,以及包括数据库中的日期类型,避免了代码的重复.
主要介绍了Java多线程编程中使用DateFormat类,文中介绍了三种相关的并发使用方法,需要的朋友可以参考下
java 使用DateFormat类获取系统的当前时间 java 使用DateFormat类获取系统的当前时间
DateFormatManager dateformat = new DateFormatManager( new char[] { DateString.CENTURY, DateString.MONTH, DateString.DAY, DateString.YEAR, DateString.WEEK, DateString.HOUR_OF_DAY, DateString.MINUTE,...
Date Format with "-"
NULL 博文链接:https://bert82503.iteye.com/blog/2106022
dateformat - 一个优秀的node.js日期格化包
前端项目-jquery-dateFormat,它是一个jquery插件,用于使用javascript格式化日期输出。
sql取日期格式中的年月天时分秒 sql取日期格式中的年月天时分秒
日期格式 Steven Levithan出色的函数的node.... var dateFormat = require ( "dateformat" ) ; var now = new Date ( ) ; // Basic usage dateFormat ( now , "dddd, mmmm dS, yyyy, h:MM:ss TT" ) ; // Saturday, June
yyyy-MM-dd形式 js timeformat dateformat
Java中DateFormat类.pdf 学习资料 复习资料 教学资源
用于转换时间格式, ... DateFormat dateFormat = new DateFormat(); 二. String timeString=dateFormat.DateFormat("yyyy-MM-dd HH:m:s",time); 参数1:填写需要的格式 参数2:填写需要改变的时间
EXTJS_DATEFORMAT 日期格式对应,网上找到的,挺好用的
dateFormat日期格式化。
个人资源
jquery-dateFormat, 使用JavaScript格式化日期输出的jQuery插件 使用JavaScript格式输出日期输出的jQuery dateformat插件- 拥有的,jQuery是最小的日期格式库。 ! 安装下载最新的jquery.dateFormat.js 或者 jquery....
dateformat.js 是一个非常简洁、轻量级、不到 5kb 的很简洁的 Javascript 库, 它是一个时间的处理工具类。
16_常用API_第2天(正则表达式、Date、DateFormat、Calendar)_讲义