`
小网客
  • 浏览: 1217640 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SimpleDateFormat线程不安全解决办法

    博客分类:
  • Java
 
阅读更多

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

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

 

 	
	private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
		protected  DateFormat initialValue() {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		}
	};

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

 

	public static DateFormat getCommonDateFormat() {
		DateFormat sdf = threadLocal.get();
		return sdf;
	}

 跟随源码ThreadLocal的get操作:

 

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

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

    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

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

结论:

 

1.如果不是重复利用的话其性能未必要,因为每次依然是new,只是说在某线程多次访问此实例的时候性能才会提升。
2.同时我们也发现了一个线程并发的实现方式。
2
3
分享到:
评论
9 楼 小网客 2013-01-09  
dcgame 写道
commons-lang.jar这个包里,已经提供了比较好的解决办法.

开销有点大巴,直接对FastDateFormat做了synchronized操作
8 楼 dcgame 2013-01-09  
commons-lang.jar这个包里,已经提供了比较好的解决办法.
7 楼 小网客 2013-01-09  
freezingsky 写道
SimpleDateFormat本身非线程安全,使用上,都是采用new的方式。没有其他 方式可选 。另一个可选方式是joda-time,该日期时间框架的操作大多都是线程安全的。

new 开销大,如果一共有2个线程多次调用你需要根据调用的次数进行new 采用我提供的方式只需要new两次即可
6 楼 freezingsky 2013-01-08  
SimpleDateFormat本身非线程安全,使用上,都是采用new的方式。没有其他 方式可选 。另一个可选方式是joda-time,该日期时间框架的操作大多都是线程安全的。
5 楼 learnworld 2013-01-08  
试试FastDateFormat。
4 楼 小网客 2013-01-08  
jinnianshilongnian 写道
这个还一种办法是使用实例池

嗯 是的
3 楼 小网客 2013-01-08  
xmx0632 写道
快用jodeTime吧

2 楼 xmx0632 2013-01-08  
快用jodeTime吧
1 楼 jinnianshilongnian 2013-01-08  
这个还一种办法是使用实例池

相关推荐

Global site tag (gtag.js) - Google Analytics