【Java】Java SimpleDateFormat 线程安全 问题

在这里插入图片描述

1.概述

在平时的工作中,我们经常需要将日期在String和Date之间做转化,此时需要使用SimpleDateFormat类。使用SimpleDateFormat类的parse方法,可以将满足格式要求的字符串转换成Date对象;使用SimpleDateFormat类的format方法,可以将Date类型的对象转换成一定格式的字符串!但是有一点需要特别注意,SimpleDateFormat并非是线程安全的,也就是说在并发环境下,如果考虑不周使用SimpleDateFormat方法可以会出现线程安全方面的问题

2. 线程安全案例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * Created on 2018/11/03.
 */
public class DateUtil {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    public static  String formatDate(Date date)throws ParseException {
        return sdf.format(date);
    }
 
    public static Date parse(String strDate) throws ParseException{
 
        return sdf.parse(strDate);
    }
}

2.1 测试类

import java.text.ParseException;
 
/**
 * Created on 2018/11/03.
 */
public class DateUtilTest {
    public static class SimpleDateFormatThread extends Thread {
 
        private String dateStr;
 
        public SimpleDateFormatThread(String dateStr){
            this.dateStr = dateStr;
        }
 
        @Override
        public void run() {
                try {
                    System.out.println(this.getName()+":"+DateUtil.parse(dateStr));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
        }
    }
    
    public static void main(String[] args) {
        String dateStr = "2018-11-03 10:02:47";
        for(int i = 0; i < 5; i++){
            new SimpleDateFormatThread(dateStr).start();
        }
 
    }
}

2.2.运行结果:

Thread-4:Sat Nov 03 10:02:47 CST 2018
Thread-0:Sat Nov 03 10:02:47 CST 2018
java.lang.NumberFormatException: multiple points
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.lang.Double.parseDouble(Double.java:538)
	at java.text.DigitList.getDouble(DigitList.java:169)
	at java.text.DecimalFormat.parse(DecimalFormat.java:2089)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
	at java.text.DateFormat.parse(DateFormat.java:364)
	at com.java.thread.demo.threadlocal.DateUtil.parse(DateUtil.java:19)
	at com.java.thread.demo.threadlocal.DateUtilTest$SimpleDateFormatThread.run(DateUtilTest.java:20)
java.lang.NumberFormatException: multiple points

不安全参考:https://blog.csdn.net/lululove19870526/article/details/83684568

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/107582095