`
小网客
  • 浏览: 1244047 次
  • 性别: 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  
这个还一种办法是使用实例池

相关推荐

    simpleDateFormat是线程不安全的

    标题指出的"simpleDateFormat是线程不安全的",意味着在多线程环境下,如果多个线程共享同一个`SimpleDateFormat`实例,可能会引发数据不一致或异常。 `SimpleDateFormat`类的线程不安全主要源于以下几个原因: 1....

    SimpleDateFormat线程不安全的5种解决方案.md

    SimpleDateFormat线程不安全的5种解决方案.md

    SimpleDateFormat线程不安全的5种解决方案.docx

    在多线程环境下,SimpleDateFormat 由于其内部状态在格式化过程中可能会被多个线程修改,因此会出现线程不安全的现象。解决这一问题的方法有多种,包括将 SimpleDateFormat 定义为局部变量、使用 synchronized 或 ...

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    SimpleDateFormat类的线程安全问题和解决方案 SimpleDateFormat类的线程安全问题 SimpleDateFormat类是Java提供的日期时间转化类,用于将日期和时间类型的数据进行解析和格式化。在Java开发中,SimpleDateFormat类...

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug...ThreadLocal注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...

    详解SimpleDateFormat的线程安全问题与解决方案

    在Java编程中,`SimpleDateFormat`是一个常用的日期时间格式化工具类,但它的设计并不是线程安全的。本文将深入探讨`SimpleDateFormat`的线程安全问题及其解决方案。 ### 1. 线程安全问题的原因 `SimpleDateFormat...

    关于SimpleDateFormat的非线程安全问题及其解决方案.docx

    ### 关于SimpleDateFormat的非线程安全问题及其解决方案 #### 一、问题介绍 在Java开发过程中,`SimpleDateFormat`是被广泛使用的日期格式化工具类。然而,在多线程环境下,`SimpleDateFormat`存在非线程安全的...

    深入理解Java:SimpleDateFormat安全的时间格式化

    SimpleDateFormat类不是线程安全的,这意味着在多线程环境下,如果多个线程同时访问同一个SimpleDateFormat实例,可能会导致各种问题,例如转化的时间不正确、报错、线程被挂死等等。 知识点2: 创建...

    Java SimpleDateFormat线程安全问题原理详解

    Java SimpleDateFormat线程安全问题原理详解 Java SimpleDateFormat线程安全问题是Java开发中一个常见的问题。SimpleDateFormat是Java中一个常用的日期时间格式化类,但是它却存在线程安全问题。在多线程环境下,...

    Java多线程环境下SimpleDateFormat类安全转换

    SimpleDateFormat类是Java中常用的日期格式化类,但是它并不是线程安全的。在多线程环境下,如果多个线程同时使用同一个SimpleDateFormat对象,可能会出现日期格式化错误的问题。 2. 使用ThreadLocal解决线程安全...

    由浅入深解析 SimpleDateFormat

    1. SimpleDateFormat 是线程不安全的,因此在多线程环境下使用需要特别注意。 2. 创建 SimpleDateFormat 实例需要消耗大量的资源,因此应当尽量少创建实例。 3. SimpleDateFormat 可以使用 applyPattern 方法修改...

    Java理论与实践:描绘线程安全性

    这类类在设计时就没有考虑线程安全,例如`SimpleDateFormat`,在1.4 JDK之前的版本中并未明确指出其线程不安全,导致许多开发者在并发场景中误用,引发错误。 在文档中清晰地记录类的线程安全性是至关重要的。如...

    Java多线程编程的线程安全性.docx

    Java标准库中有一些类,如ArrayList、HashMap和SimpleDateFormat,并未设计为线程安全,因此在多线程环境下直接使用可能导致数据不一致或其他问题。开发者应当了解每个类的线程安全特性,以便做出正确的选择和适当地...

    有关SimpleDateFormat的常用方法说明

    - `SimpleDateFormat`是线程不安全的,如果在多线程环境中使用,需要考虑同步问题。 - 日期和时间的格式化字符串要与实际情况对应,避免出现理解错误。 以上就是关于`SimpleDateFormat`的一些常见用法和注意事项,...

    java SimpleDateFormat &Calendar

    需要注意的是,由于`SimpleDateFormat`不是线程安全的,所以在多线程环境中,建议为每个线程创建单独的实例。 `Calendar`类则是Java中更底层的日期和时间工具,它提供了一套完整的API来操作日期和时间,包括添加、...

    Java ThreadLocal 线程安全问题解决方案

    Java中的ThreadLocal是解决线程安全问题的一个重要工具,它提供了一种在多线程环境下为每个线程维护独立变量副本的方法,从而避免了共享状态带来的竞态条件和线程安全问题。 线程安全问题通常由全局变量和静态变量...

    JavaScript实现的SimpleDateFormat

    在JavaScript中,没有内置的`SimpleDateFormat`类,它是一个Java中的类,用于日期和时间的格式化。然而,由于JavaScript在处理日期时的功能相对有限,开发者常常需要自定义函数或者使用第三方库来实现类似的功能。这...

    SimpleDateFormat使用详解

    SimpleDateFormat 使用详解 SimpleDateFormat 是 Java 中的一个日期和时间格式化类,它继承自 DateFormat 类。SimpleDateFormat 允许用户以各种方式格式化日期和时间,例如以年、月、日、时、分、秒等不同的格式来...

    软件安全监测报告.pdf

    这份软件安全监测报告主要是监测java开发程序中出现的安全问题,找了一个项目程序监测后出现的原版报告显示,在使用DES加解密的情况下,会被检测...还有关于SimpleDateFormat线程不安全的问题,都有详细解释及处理方法

Global site tag (gtag.js) - Google Analytics