美文网首页
SimpleDateFormat线程安全问题

SimpleDateFormat线程安全问题

作者: LandHu | 来源:发表于2019-09-23 20:48 被阅读0次

    解答下别人的疑惑,顺便整理下这个知识点........
    SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。

    有以下的例子可以正确使用SimpleDateFormat:

    // 1. 在方法内部使用,没有线程安全问题
    private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
    public String getFormat(Date date){
        SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
        return dateFormat.format(date);
    }
    
    
    // 2. 每次使用的时候加锁      
    private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public void getFormat(){
        synchronized (SIMPLE_DATE_FORMAT){
        SIMPLE_DATE_FORMAT.format(new Date());
        ….;
    }
    
    // 3. 使用ThreadLocal,每个线程都有自己的SimpleDateFormat对象,互不干扰
    private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };
    
    // 4. 使用DateTimeFormatter(This class is immutable and thread-safe.)
     DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     System.out.println(timeFormatter.format(LocalDateTime.now()));
    

    如果是JDK8应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat。


    技术讨论 & 疑问建议 & 个人博客

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,转载请注明出处!

    相关文章

      网友评论

          本文标题:SimpleDateFormat线程安全问题

          本文链接:https://www.haomeiwen.com/subject/ychlyctx.html