SimpleDateFormat在使用时为什么会出现线程不安全的情况,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
通过一个例子描述多线程情况下出现SimpleDateFormat未按照预期情况处理数据
使用线程池执行任务,每次将日期的天数加1,多线程情况下结果并非预期值
public class SimpleDateFormatInMultiThread {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
private static ExecutorService pool = new ThreadPoolExecutor(5, 200, 90L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
private static CountDownLatch countDownLatch = new CountDownLatch(50);
/**
* 如何解决SimpleDateFormat线程不安全问题
* 1 单独在线程中使用局部变量
* 2 加同步锁
* 3 使用threadlocal使用独立线程对象
* 4 使用java8中DateTimeFormat代替
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Set<String> dates = Collections.synchronizedSet(new HashSet<String>());
for (int i = 0; i <50; i++) {
Calendar calendar = Calendar.getInstance();
int finalI = i;
pool.execute(() -> { countDownLatch.countDown();
calendar.add(Calendar.DATE, finalI); String dateString;
synchronized (simpleDateFormat){
dateString = simpleDateFormat.format(calendar.getTime());
}
dates.add(dateString);
});
}
countDownLatch.await();
System.out.println(dates.size());
}
}
集合中出现元素重复情况,如何避免数据不一致情况?
1 使用同步关键字synchronized,对并发语句加锁
2 使用独立的变量
3 使用ThreadLocal,为每个线程分配互不影响的format对象
4 使用线程安全的类进行格式化,java8中提供了DateTimeFormat类
关于SimpleDateFormat在使用时为什么会出现线程不安全的情况问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/iioschina/blog/4528295