【业务功能篇 150】Java8 Time时间优化 解决线程不安全

- SimpleDateFormat,并不是一个线程安全的类。 使用 ThreadLocal 优化

比如多线程任务执行业务逻辑中存在时间字段的格式处理,出错的概率低,这个主要是因为业务并发量问题,大多数并发小,一旦大起来,那就会导致当前线程取得时间,是其他线程设置了的时间,时间覆盖错乱,因为其底层是final修饰,共享变量且没有做线程安全控制锁之类的;为了线程安全最直接的方式,就是每次调用都直接 new SimpleDateFormat。但这样的方式终究不是最好的,所以我们使用 ThreadLocal ,来优化这段代码。

 

private static ThreadLocal<SimpleDateFormat> threadLocal = ThreadLocal.withInitial(
() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 

public static void main(String[] args) { 
 while (true) { 
 new Thread(() -> { 
     String dateStr = threadLocal.get().format(new Date()); 
     try { 
         Date parseDate = threadLocal.get().parse(dateStr); 
         String dateStrCheck = threadLocal.get().format(parseDate); 
         boolean equals = dateStr.equals(dateStrCheck); 
         if (!equals) { 
         System.out.println(equals + " " + dateStr + " " + dateStrCheck);
         } else { 
         System.out.println(equals); 
     } 
     } catch (ParseException e) { 
     System.out.println(e.getMessage()); 
     } 
 }).start(); 
 } 
} 

 

如上我们把 SimpleDateFormat ,放到 ThreadLocal 中进行使用,即不需要重复
new 对象,也避免了线程不安全问题 ,使用 ThreadLocal 一定要记得 new ThreadLocal<>().remove(); 操作。
避免弱引用发生 GC 后,导致内存泄漏的问题。不过如果持续使用就不用移除

优化方式二:(Java8里的 java.time.format.DateTimeFormatter是线程安全的, time里的DateTimeFormat也是线程安全的)。

Java8日期类LocalDate、LocalTime、LocalDateTime使用详解-CSDN博客

18个Java8日期处理的实践,太有用了!-CSDN博客

SimpleDateFormat两个著名的坑_为什么simpledateformat.format(new date())会产生一些不正确的时间-CSDN博客

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值