我们在服务器中记录一些事件,我们得到每个事件的当前时间,实例化一个新的Date对象。像这个new Date()
但是昨天出了问题。记录器显示该条目记录在2012-01-21 14:06:04
,但该事件与new Date()
的时间不同,该时间为:2012-01-21 13:06:04
差一个小时
尽管如此,其他事件在这个bug事件前后都得到了正确的时间。
奖金
我们使用以下格式化程序记录事件:
// Of course, this means that we read our buggy timestamp like: '120121130604'
// but that's irrelevant :p
public static SimpleDateFormat messageDateTimeFormatter = new SimpleDateFormat("yyMMddHHmmss");
有什么想法吗?
假设SimpleDateFormat是一个公共静态字段,我猜多个线程正在同时使用它。但是SimpleDateFormat不是线程安全的:
日期格式不同步。建议创建每个线程的单独格式实例。如果多个线程访问一个格式,它必须在外部同步。
同步其使用,或将其存储在ThreadLocal变量中,或每次创建一个新实例。
您得到的可能是由于并发使用SimpleDateFormat而导致的某些竞争条件或其他与线程相关的错误。