前言
算是去年的事情,无意中浏览到一篇文章,标题唬人。。链接奉上 戳我
认真看完后发现我正在入他之前走的坑 细思极恐~~~
简单交代下背景,目前设计项目各日志log通过logback组件统一保存到mongodb,日期的处理避免不了,然后之前代码如下:
你看,我犯了同样的错误。。。SimpleDateFormat是非同步的,在高并发下会导致异常(后续:后来重看《Java并发编程实战》,里面有一句顺便提到过SimpleDateFormat类是非线程安全的。 大哭,,,怪自己不仔细)
现在不像在之前公司做企业系统那样,只要自己代码走通就ok了。 现在考虑以后各个工程log都是走这边 所以并发状态下会有问题。 但是上文的作者最后使用局部变量代替了全局变量,虽然解决问题,有一个缺陷是会导致创建大量的对象。需要优化。
当然优化的方法有几种,比如使用synchronized关键字,还有使用ThreadLocal
伪代码:
private static final ThreadLocal<SimpleDateFormat> t = new ThreadLocal<SimpleDateFormat>() { |
最近在看Java8 in action 在16年终总结也说了 多多使用8的特性,嘿嘿 所以 我选择使用8的方法解决,
Java8 日期api中DateTimeFormatter 是线程安全。
代码如下:
ps:敲代码时多思考,不是只有在解决秒杀时才去考虑高并发,并发无小事。
- 本文标题: 【Java8学习前言篇】未雨绸缪 并发无小事
- 文章作者: sherryriver(木木三可)
- 发布时间: 2017.01.17
- 本文链接: https://sherryriver.github.io/2017/01/17/simpleDateFormat/
- 许可协议: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。