ThreadLocal:如何优雅的解决:如何优雅的解决SimpleDateFormat多线程安多线程安
全问题全问题
目录目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型
(format)SimpleDateFormat出现bug的原因如何解决SimpleDateFormat多线程安全问题局部变量使用SimpleDateFormat方
法时加锁使用ThreadLocalThreadLocal介绍ThreadLocal使用demoThreadLocal源码探索ThreadLocal注意事项使用
ThreadLocal解决SimpleDateFormat线程安全问题总结
又是风和日丽的一天,我正在快乐的写着bug,突然感觉到背后一阵凉风吹过,我感觉肯定有大事发生,我转头一看,果然,
小明笑嘻嘻的站在我身后,边笑边说:哥,忙吗?不忙的话帮我看个问题呗!每次他的问题都十分诡异,不过身为同事,还是
应该相互帮助的,我决定与他一起看看他的问题。
SimpleDateFormat诡异诡异bug
SimpleDateFormat应该是我们开发中使用比较多的工具类了吧,小明也在项目中使用到了,但就是这个工具类让小明痛苦了
好长一段时间,为什么呢?那是因为测试工程师的小哥哥们在辛劳的做着接口性能测试,但是发现有些接口返回的日期时间是
错乱的,不符合实际结果,这个时候,禅道中就多出了一道美丽的风景线,那就是bug:在并发接口测试中,日期返回的数据
偶尔错误。
就是这么一个bug,让小明郁闷了好长一段时间,实在找不到解决方案,这才找到了我,我来看了他的业务代码之后,发现他
使用了SimpleDateFormat这个工具类来格式化时间, 并且还是静态的,这个时候我就知道为什么平时做功能测试的时候没有
问题,在做性能测试的时候bug就出来了,小明也是刚毕业不久,对多线程这一块不是怎么的熟悉,所以这个也不能怪他,我
们现在使用demo来复现一下SimpleDateFormat的诡异bug吧。
复现复现SimpleDateFormat诡异诡异bug
我这里将使用demo的形式来复现一下SimpleDateFormat存在的bug。
字符串日期转字符串日期转Date日期(日期(parse))
package com.ymy.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatBugTest {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static Date parse(String date){
Date parse = null;
try {
return sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
Date parse = parse("2020-12-12 12:12:12");
System.out.println("当前日期:" + parse);
});
Thread t2 = new Thread(() -> {
Date parse = parse("2020-12-12 12:12:12");
System.out.println("当前日期:" + parse);
});
Thread t3 = new Thread(() -> {
Date parse = parse("2018-10-10 10:10:10");
System.out.println("当前日期:" + parse);
});
t1.start();
t2.start();
t3.start();
评论0