SimpleDateFormat线程不安全验证实验
1 | package cn.qiweiwei.concurrentdate; |
输出结果:
1 | Thread error |
日期要么是错的,要么发生了异常。
解决办法:
加锁:线程内:synchronized(simpleDateFormat) { ..do parse and format. }
定义线程局部变量:变量是同一个,但是每个线程使用同一个初始值,存取数据只在本线程内有效(内部通过一个Map(实际是内部类ThreadLocalMap)存取数据,存取数据只在同一线程有效)
1 | private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){ |
使用方法:
1 | new Thread(new Runnable() { |
- jdk8推荐方法:
使用 Instant 代替 Date, LocalDateTime 代替 Calendar,
DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释: simple beautiful strong
immutable thread-safe。
变量转换如链接所示: