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
这段代码就实现了,线程只会取到属于自己的SimpleDateFormat。
我们还可以用SimpleDateFormat做一个简单的系统流水获取
图中代码是在static方法加锁,方法里线程睡眠1ms,由于线程需要同步访问,所以获取的流水号肯定唯一;如果是高并发(1Ktps+)场景,不太可取。
更多推送文章请关注公众号: