SimpleDateFormat 你真的用对了吗?

SimpleDateFormat 常用来做日期与字符串的转换,但你真的用对了吗?

A同学这样用:

每次需要时就 SimpleDateFormat sdf = new SimpleDateFormat(datePattern)。

B同学觉得每次都new很多余,然后改造成单例:

public static SimpleDateFormat sdf = new SimpleDateFormat(datePattern)。

如果不了解SimpleDateFormat,一定会觉得B同学这种方式更好,你是不是这样认为了? 哈哈~~

SimpleDateFormat类是线程非安全的,如果多个线程同时操作SimpleDateFormat的某一个方法,可能会出现意想不到的错误转换结果。有兴趣自己试验加深印象~

所以说,SimpleDateFormat单例是非线程安全的,不可用。

但用A同学的方法又显得太low,需要new很多对象,我们采取一种折中的方法,为每一个线程分配一个SimpleDateFormat。

ThreadLocal具有线程资源隔离性,可以把ThreadLocal想象成一个线程集合,每一个线程可以存放独立的资源,只要线程不销毁,资源就不会释放。

直接看代码,如何为每一个线程分配一个SimpleDateFormat

 

blob.png

 

这段代码就实现了,线程只会取到属于自己的SimpleDateFormat。

我们还可以用SimpleDateFormat做一个简单的系统流水获取

blob.png

 

图中代码是在static方法加锁,方法里线程睡眠1ms,由于线程需要同步访问,所以获取的流水号肯定唯一;如果是高并发(1Ktps+)场景,不太可取。

更多推送文章请关注公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值