SimpleDateFormat非线程安全
2017-07-17 17:25
441 查看
类SimpleDateFormat主要负责日期的装换和格式化,但在多线程的环境中,使用此类容易造成数据转换及处理的不准确,因为SimpleDateFormat类并不是线程安全的。
这是因为单例的SimpleDateFormat是不安全的,所以我们可以考虑使用多例。
这种方法会创建多个SimpleDateFormat对象,如果我们希望少创建对象,我们可以考虑使用ThreadLocal。
package me.mymilkbottles.Study11; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Administrator on 2017/07/17 17:08. */ public class SimpleDateFormatStudy { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); String[] strings = new String[]{"2017", "2016", "2014", "2012", "2010", "2017", "1997", "1990", "1999", "1998", "1875", "1987", "1991", "1993", "1994", "1777", "1853", "1879", "1888", "1889"}; for (String date : strings) { new MyThread(sdf, date).start(); } } } class MyThread extends Thread { private SimpleDateFormat sdf; private String date; public MyThread(SimpleDateFormat sdf, String date) { this.sdf = sdf; this.date = date; } @Override public void run() { Date parseDate = null; try { parseDate = sdf.parse(date); } catch (ParseException e) { e.printStackTrace(); } if (!sdf.format(parseDate).toString().equals(date)) { System.out.println(sdf.format(parseDate).toString() + " != " + date); } } }
这是因为单例的SimpleDateFormat是不安全的,所以我们可以考虑使用多例。
package me.mymilkbottles.Study11; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Administrator on 2017/07/17 17:08. */ public class SimpleDateFormatStudy { public static void main(String[] args) { String[] strings = new String[]{"2017", "2016", "2014", "2012", "2010", "2017", "1997", "1990", "1999", "1998", "1875", "1987", "1991", "1993", "1994", "1777", "1853", "1879", "1888", "1889"}; for (String date : strings) { new MyThread(date).start(); } } } class MyThread extends Thread { private String date; public MyThread(String date) { this.date = date; } @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); Date parseDate = null; try { parseDate = sdf.parse(date); } catch (ParseException e) { e.printStackTrace(); } if (!sdf.format(parseDate).toString().equals(date)) { System.out.println(sdf.format(parseDate).toString() + " != " + date); } } }
这种方法会创建多个SimpleDateFormat对象,如果我们希望少创建对象,我们可以考虑使用ThreadLocal。
package me.mymilkbottles.Study11; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by Administrator on 2017/07/17 17:08. */ public class SimpleDateFormatStudy { public static void main(String[] args) { String[] strings = new String[]{"2017", "2016", "2014", "2012", "2010", "2017", "1997", "1990", "1999", "1998", "1875", "1987", "1991", "1993", "1994", "1777", "1853", "1879", "1888", "1889"}; for (String date : strings) { Thread thread = new MyThread(date); thread.start(); } } } class MyThread extends Thread { public static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<>(); private String date; public MyThread(String date) { this.date = date; } @Override public void run() { SimpleDateFormat sdf = threadLocal.get(); if (sdf == null) { sdf = new SimpleDateFormat("yyyy"); threadLocal.set(sdf); } Date parseDate = null; try { parseDate = sdf.parse(date); } catch (ParseException e) { e.printStackTrace(); } if (!sdf.format(parseDate).toString().equals(date)) { System.out.println(sdf.format(parseDate).toString() + " != " + date); } } }
相关文章推荐
- SimpleDateFormat 非线程安全
- SimpleDateFormat非线程安全
- SimpleDateFormat的测试,此类不是线程安全的。
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- SimpleDateFormat非线程安全
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- SimpleDateFormat使用和线程安全问题
- SimpleDateFormat非线程安全
- SimpleDateFormat时间格式化存在线程安全问题
- sdf SimpleDateFormat 不是线程安全的,
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- Java中SimpleDateFormat 线程安全
- SimpleDateFormat不是线程安全的
- SimpleDateFormat 不是线程安全的
- SimpleDateFormat线程安全
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- SimpleDateFormat不是线程安全的类
- SimpleDateFormat 线程安全的解决方案--DateTimeFormatter