zoukankan      html  css  js  c++  java
  • SimpleDateFormat非线程安全

     1 //成员变量calendar,多线程下共享
     2 protected Calendar calendar;
     3 
     4 private StringBuffer format(Date var1, StringBuffer var2, FieldDelegate var3) {
     5         this.calendar.setTime(var1);
     6         boolean var4 = this.useDateFormatSymbols();
     7         int var5 = 0;
     8 
     9         while(var5 < this.compiledPattern.length) {
    10             int var6 = this.compiledPattern[var5] >>> 8;
    11             int var7 = this.compiledPattern[var5++] & 255;
    12             if (var7 == 255) {
    13                 var7 = this.compiledPattern[var5++] << 16;
    14                 var7 |= this.compiledPattern[var5++];
    15             }
    16 
    17             switch(var6) {
    18             case 100:
    19                 var2.append((char)var7);
    20                 break;
    21             case 101:
    22                 var2.append(this.compiledPattern, var5, var7);
    23                 var5 += var7;
    24                 break;
    25             default:
    26                 this.subFormat(var6, var7, var3, var2, var4);
    27             }
    28         }
    29 
    30         return var2;
    31     }

    解决方案:
    阿里规范

    【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。 正例:注意线程安全,使用DateUtils。亦推荐如下处理:

    public class DateUtils {

    private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>(){
    @Override
    protected DateFormat initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd");
    }
    };

    public static Date parse(String formatPattern, String dateString) throws ParseException {
    return threadLocal.get().parse(dateString);
    }

    public static String format(String formatPattern, Date date) {
    return threadLocal.get().format(date);
    }
    }

    说明:如果是JDK8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。

    public class DateUtils {
    
            public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
            public static LocalDate parse(String dateString){
                return LocalDate.parse(dateString, DATE_TIME_FORMATTER);
            }
    
            public static String format(LocalDate target) {
                return target.format(DATE_TIME_FORMATTER);
            }
        }
  • 相关阅读:
    在Oracle中计算两个日期间隔的天数、月数和年数
    洛谷P1182 数列分段 Section II(二分+贪心)
    BZOJ1734 [Usaco2005 feb]Aggressive cows 愤怒的牛(二分答案+贪心)
    分治算法
    洛谷P1031 [NOIP2002]均分纸牌
    洛谷P1803 凌乱的yyy / 线段覆盖
    洛谷P1094 [NOIP2007]纪念品分组
    洛谷P1223 排队接水
    洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk
    洛谷P1181 数列分段Section1
  • 原文地址:https://www.cnblogs.com/sulishihupan/p/14255074.html
Copyright © 2011-2022 走看看