SimpleDateFormat线程安全问题原因与解决方案

1.原因

SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用, 并且, 观察 sdf.parse() 方法,你会发现有如下的调用:

@Override
    public Date parse(String text, ParsePosition pos)
    {
       ...
            CalendarBuilder calb = new CalendarBuilder();
       ...
            //calb的establish会先调用calendar的clear方法
            parsedDate = calb.establish(calendar).getTime();
       ...
    }

 2.解决方法

2.1每次使用时,都创建一个新的simpledateformat实例

2.2使用同步

2.3借助threadlocal对象每个线程只创建一个实例

猜你喜欢

转载自pigxu.iteye.com/blog/2326277