SimpleDateFormat在使用时为什么会出现线程不安全的情况,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联公司主营西乡塘网站建设的网络公司,主营网站建设方案,成都app软件开发公司,西乡塘h5成都微信小程序搭建,西乡塘网站营销推广欢迎西乡塘等地区企业咨询
通过一个例子描述多线程情况下出现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(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 dates = Collections.synchronizedSet(new HashSet ()); 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在使用时为什么会出现线程不安全的情况问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。