读书人

SimpleDateFormat线程不安全解决方法

发布时间: 2013-01-18 10:22:42 作者: rapoo

SimpleDateFormat线程不安全解决办法

SimpleDateFormat是线程不安全的,如果不考虑代价的问题,那么我们完全可在每次需要的时候直接new一个,但是这不是一个很好的解决方式,那么有没有一个相对性能高的办法?

有!一定有,最基本的可以解决问题但是性能上并不一定是最好的,那么我们可以借助ThreadLocal来实现,具体的代码实现如下:

Java代码:
  1. private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
  2. protected DateFormat initialValue() {
  3. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4. }
  5. };

在进行get操作的时候直接从threadLocal中获取,代码如下:

Java代码:
  1. public static DateFormat getCommonDateFormat() {
  2. DateFormat sdf = threadLocal.get();
  3. return sdf;
  4. }

跟随源码ThreadLocal的get操作:

Java代码:
  1. public T get() {
  2. Thread t = Thread.currentThread();
  3. ThreadLocalMap map = getMap(t);
  4. if (map != null) {
  5. ThreadLocalMap.Entry e = map.getEntry(this);
  6. if (e != null)
  7. return (T)e.value;
  8. }
  9. return setInitialValue();
  10. }

我们发现他维护了一个ThreadLocalMap,当此时的thread已经创建过,那么直接返回,没有的话那么执行setInitialValue(),我们看一下setInitialValue我们发现:

Java代码:
  1. private T setInitialValue() {
  2. T value = initialValue();
  3. Thread t = Thread.currentThread();
  4. ThreadLocalMap map = getMap(t);
  5. if (map != null)
  6. map.set(this, value);
  7. else
  8. createMap(t, value);
  9. return value;
  10. }

他去初始化一个也就是我们new一个,然后set到相应的map中去。

结论:原文参考自站长网http://www.software8.co/wzjs/java/2655.html

Java代码:
  1. 1.如果不是重复利用的话其性能未必要,因为每次依然是new,只是说在某线程多次访问此实例的时候性能才会提升。
  2. 2.同时我们也发现了一个线程并发的实现方式。

读书人网 >编程

热点推荐