SimpleDateFormat的线程安全问题

一、案例

在多线程环境*享了SimpleDateFormat的实例,例如SimpleDateFormat对象作为单例对象中的全局属性、或者 SimpleDateFormat对象是被static修饰的全局属性。

二、分析

通过源码分析, SimpleDateFormat类内部有一个Calendar对象,用来存储相关日期信息。当多个线程同时使用相同的SimpleDateFormat对象的时候,会同时调calender.setTime方法,导致time被别的线程修改,因此是线程不安全的。

三、解决方案

1、将SimpleDateFormat定义成局部变量
缺点:每调用一次就会创建一个对象,方法结束时垃圾回收
2、加线程同步锁
缺点:性能较差
3、使用ThreadLocal,每个线程都拥有自己的SimpleDateFormat对象副本
4、使用DateTimeFormatter代替, DateTimeFormatter是线程安全的

四、总结

在多线程环境下,需要注意共享变量的线程安全问题。

上一篇:geoserver之GeoServerEnvironment


下一篇:DateTimeFormatter 格式化或解析日期、时间