一、案例
在多线程环境*享了SimpleDateFormat的实例,例如SimpleDateFormat对象作为单例对象中的全局属性、或者 SimpleDateFormat对象是被static修饰的全局属性。
二、分析
通过源码分析, SimpleDateFormat类内部有一个Calendar对象,用来存储相关日期信息。当多个线程同时使用相同的SimpleDateFormat对象的时候,会同时调calender.setTime方法,导致time被别的线程修改,因此是线程不安全的。
三、解决方案
1、将SimpleDateFormat定义成局部变量
缺点:每调用一次就会创建一个对象,方法结束时垃圾回收
2、加线程同步锁
缺点:性能较差
3、使用ThreadLocal,每个线程都拥有自己的SimpleDateFormat对象副本
4、使用DateTimeFormatter代替, DateTimeFormatter是线程安全的
四、总结
在多线程环境下,需要注意共享变量的线程安全问题。