[原]simpledateformat线程不安全解决方案

标签: | 发表时间:2015-09-07 00:26 | 作者:bejustice
出处:http://blog.csdn.net/bejustice

1      出现原因

代码功能性测试和低并发测试时一切正常,但是高并发多线程性能测试时出现

java.lang.NumberFormatException: multiplepoints错误,排查原因发现是SimpleDateFormat线程不安全引起。

2      网上解决方案

1.      局部变量,每次new SimpleDateFormat,这样开销过大,对性能影响大;

2.      ThreadLocal,每个线程一个SimpleDateFormat;需要维护额外代码;

3.      同步代码块 synchronized,影响并发性能;

4.      使用第三方的日期处理函数,保证线程安全;

3       joda-time的使用

这里我主要使用第三方日期处理函数来解决问题。

3.1  为什么不用FastDateFormat

一开始使用commons-lang的FastDateFormat发现功能不够强大,不支持SimpleDateFormat的 setLenient(false),不能严格限制日期转换。

为什么使用joda-time?

Ø  一个面向 Java™ 平台的易于使用的开源时间/日期库;

Ø  Joda-Time令时间和日期值变得易于管理、操作和理解;

Ø  可扩展性、完整的特性集以及对多种日历系统的支持;

Ø  Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码;

3.2  简单使用

3.2.1  string类型转datetime格式判断

DateTimeFormatter format = DateTimeFormat. forPattern("yyMMddHHmmss");

try {

            format.parseDateTime(deviceRegisterRequest.getTimestamp());

         } catch (Exception e) {

            // TODO: handle exception

            setErrorInfo(ErrorCode. parameterOutOfRange, "设备注册timestamp出错");

            return getErrorInfo();

                            }

4      参考文献

http://h819.iteye.com/blog/611099

 

http://blog.csdn.net/zeus_9i/article/details/32318771

 

作者:bejustice 发表于2015/9/6 16:26:36 原文链接
阅读:23 评论:0 查看评论

相关 [simpledateformat 线程 安全] 推荐:

[原]simpledateformat线程不安全解决方案

- - bejustice的专栏
代码功能性测试和低并发测试时一切正常,但是高并发多线程性能测试时出现. java.lang.NumberFormatException: multiplepoints错误,排查原因发现是SimpleDateFormat线程不安全引起. 2      网上解决方案. 1.      局部变量,每次new SimpleDateFormat,这样开销过大,对性能影响大;.

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

- - 大伟
参考:http://my.oschina.net/leejun2005/blog/152253. (2)使用 ThreadLocal. (3)同步代码块 synchronized(code). (4)使用第三方的日期处理函数:. 之前有同事好几次都掉这个坑里去了,刚好今天有看到有篇帖子提了下,索性就整理下吧~.

SimpleDateFormat和FastDateFormat的效率测试,FastDateFormatr优于SimpleDateFormat

- - 企业架构 - ITeye博客
需要引入commons-lang包,Maven配置如下:. System.out.println("执行第"+num+"次");.  从运行结果来看,FastDateFormat效率明 SimpleDateFormat . 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

什么是线程安全

- - CSDN博客编程语言推荐文章
线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题. 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源. 如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件. 实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的.

Servlet是否线程安全

- - 研发管理 - ITeye博客
Servlet是线程安全吗. 要解决这个问题,首先要知道什么是线程安全:.   如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码. 如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题.

web开发中的线程安全

- - 编程 - 编程语言 - ITeye博客
在web开发中,要关注由于并发访问所导致的对某一同一个值的修改,否则信息会造成泄漏servlet是在多线程环境下的. 即可能有多个请求发给一个servelt实例,每个请求是一个线程. struts下的action也类似,同样在多线程环境下. 译:为多线程环境编写代码. 我们的controller servlet指挥创建你的Action 类的一个实例,用此实例来服务所有的请求.

Spring并发访问的线程安全性问题

- - 寒江孤影
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题.

Spring单实例、多线程安全、事务解析

- - zzm
 在使用Spring时,很多人可能对Spring中为什么DAO和Service对象采用单实例方式很迷惑,这些读者是这么认为的:.     DAO对象必须包含一个数据库的连接Connection,而这个Connection不是线程安全的,所以每个DAO都要包含一个不同的Connection对象实例,这样一来DAO对象就不能是单实例的了.

APP 缓存数据线程安全问题探讨

- - bang’s blog
一般一个 iOS APP 做的事就是:请求数据->保存数据->展示数据,一般用 Sqlite 作为持久存储层,保存从网络拉取的数据,下次读取可以直接从 Sqlite DB 读取. 我们先忽略从网络请求数据这一环节,假设数据已经保存在 DB 里,那我们要做的事就是,ViewController 从 DB 取数据,再传给 view 渲染:.

EntityFramework DbContext 线程安全 - 田园里的蟋蟀 - 博客园

- -
不要被提示信息中的 Use 'await' 所迷惑,如果你仔细查看下代码,发现并没有什么问题,上面这段异常信息,是我们在 async/await 操作的时候经常遇到的,什么意思呢. :在这个上下文,第二个操作开始于上一个异步操作完成之前. 可能有点绕,简单说就是,在同一个上下文,一个异步操作还没完成,另一个操作就开始了.