首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

SimpleDateFormat线程不安全解决方法

2013-01-18 
SimpleDateFormat线程不安全解决办法SimpleDateFormat是线程不安全的,如果不考虑代价的问题,那么我们完全

SimpleDateFormat线程不安全解决办法

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

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

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

 在进行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.同时我们也发现了一个线程并发的实现方式。  

热点排行