导航
导航
文章目录
  1. 前言
  • 【Java8学习前言篇】未雨绸缪 并发无小事

    前言

    算是去年的事情,无意中浏览到一篇文章,标题唬人。。链接奉上 戳我

    认真看完后发现我正在入他之前走的坑 细思极恐~~~
    简单交代下背景,目前设计项目各日志log通过logback组件统一保存到mongodb,日期的处理避免不了,然后之前代码如下:

    你看,我犯了同样的错误。。。SimpleDateFormat是非同步的,在高并发下会导致异常(后续:后来重看《Java并发编程实战》,里面有一句顺便提到过SimpleDateFormat类是非线程安全的。 大哭,,,怪自己不仔细)

    现在不像在之前公司做企业系统那样,只要自己代码走通就ok了。 现在考虑以后各个工程log都是走这边 所以并发状态下会有问题。 但是上文的作者最后使用局部变量代替了全局变量,虽然解决问题,有一个缺陷是会导致创建大量的对象。需要优化。

    当然优化的方法有几种,比如使用synchronized关键字,还有使用ThreadLocal
    伪代码:

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

    最近在看Java8 in action 在16年终总结也说了 多多使用8的特性,嘿嘿 所以 我选择使用8的方法解决,
    Java8 日期api中DateTimeFormatter 是线程安全。
    代码如下:

    ps:敲代码时多思考,不是只有在解决秒杀时才去考虑高并发,并发无小事。