simpleDateFormat是线程不安全的

有人都喜欢把SimpleDateFormat实例用在多线程环境下,

有两种情况:
1) 定义成类的静态成员
 Private static final SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMdd”);

2) 定义成类的成员
 Private SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMdd”);


这两种情况都有可能被多个线程使用, 随时都有可能出错.
见附件的一个测试例子, 两个线程不停的调用, 大概十几次就有可能一次出错.

[b]原因:[/b]
因为SimpleDateFormat处理复杂,Jdk的实现中使用了成员变量来传递参数,这个就造成在多线程的时候会出现错误。
[b]
Doc:[/b]
实际上, JDK 1.4,JDK5.0, JDK 6.0 都在文档中明确说了是线程不安全的, 包括 DateFormat, MessageFormat, NumberFormat, DecimalFormat, SimpleDateFormat 等等.

后果:
1) 从附件中测试的例子可以看出, 很容易就线程间的数据乱掉了.
2) 网上有说在多线程环境下执行会抛exception的情况.
3) 用的很频繁, 导致内存泄露, 很容易就出现内存溢出.

安全的用法:
1) 每次用的时候new 一个实例.
public static final String DATE_FORMAT= "yyyy-MM-dd";
public static String formatDate(Date date){
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
return sdf.format(date);
}


2) 所有用到同一个SimpleDateFormat实例的地方用synchronized进行同步.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值