您的位置:首页 > 其它

从SimpleDateFormat出发去理解线程安全

2016-08-24 17:03 274 查看
项目中多个地方需要用到SimpleDateFormat,为了方便我在service中把SimpleDateFormat写成全局变量,在多线程调用service时突然发现有很多未知意义的时间被格式化,
查了资料得知SimpleDateFormat不是线程安全的。当多线程去调用该变量的时候,就会得到许多不可预期的值。
那该问题如何解决呢?最简单的当然是在每一个线程调用service调用SimpleDateFormat时,重新new一个。这样做自然是为了线程本地化,
为了实现线程本地化,还可以使用threadlocal。
举个小栗子:
ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");};
};

private SimpleDateFormat getFormatter(){
return formatter.get();
}


这样在使用的时候直接用:
formatter.get()


就可以得到一个本地化的SimpleDateFormat对象了。当然也可以简单的将SimpleDateFormat对象定义为final类型。
本地化的思路是以空间换时间,实现线程安全。也有以时间换空间的做法,比如同步机制,暂时不详细介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: