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