利用ThreadLocal解决SimplaDateFormat线程不安全的问题

在最近的工作中,无意中使用一个SimpleDateFormat把日期时间字符串转换为Date对象,发现存在时间很异常的情况,比如出现时间年份明显不对的情况。

后来在网上查看发现,原来是SimpleDateFormat不是线程安全导致的。后来改写了DateUtil,利用ThreadLocal达到线程安全效果。

ThreadLocal对象一个新线程里第一次被调用时,会调用initialValue方法,后续此线程就会用这个方法返回的对象进行处理,相当于每个线程有一个独立的SimpleDateFormat对象,达到了线程安全的效果。

 1 class DateUtil{
 2     private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>(){
 3         protected SimpleDateFormat initialValue() {
 4             return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 5         }
 6     };
 7     public static  Date parse(String strtime){
 8         try{
 9             return threadLocal.get().parse(strtime);
10         } catch( ParseException e){
11             e.printStackTrace();
12         }
13         return null;
14     }
15
16     public static String format(Date date){
17         try{
18             return threadLocal.get().format(date);
19         } catch( Exception e){
20             e.printStackTrace();
21         }
22         return null;
23     }
24
25
26 }
时间: 2024-10-28 21:50:16

利用ThreadLocal解决SimplaDateFormat线程不安全的问题的相关文章

Spring学习11- Spring使用ThreadLocal解决线程安全问题

ThreadLocal是什么      早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”.其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些.      当使用ThreadLoca

ThreadLocal解决了什么问题

小明所在的项目组(迭代组:一直在迭代的路上),经常会在已有接口的基础上开发一些小功能,并且前提是在保证现有用户的不受影响基础上迭代.功能迭代,在代码层面小明有1w种实现方法(吹牛的),一起来看看这次小明如何使用ThreadLocal优雅地完成本次迭代吧! 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLocal 本身,而用 实例 代表具体类型(如 StringBuidler )的实例. 理解误区

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

利用ThreadLocal建立高质量事务处理

ThreadLocal此类是一个以当前线程为key的map对象的构想. 当我们在web开发中,多个浏览器访问的时候,servlet为它们各开线程执行相应代码,而事务的执行依赖于特定的一个Connection对象当中.所以用到了ThreadLocal类来封装<Connection>来取和放. 业务逻辑中不出现 Connection对象,代码风格好 数据库表 1 create table account 2 ( id int primary key, 3 name varchar(20), 4 f

利用CWinThread实现跨线程父子MFC窗口

利用CWinThread实现跨线程父子MFC窗口 MFC对象只能由创建该对象的线程访问,而不能由其他线程访问. 不遵守该准则将导致断言(assertion)或者无法预知的程序行为等运行期错误. 在多线程环境中,由于所有的窗口元素都通过线程来管理,于是MFC将暂时/永久窗口<->句柄映射保存在TLS中.其他的窗口句柄映射以及设备描述表也是采用类似的方法存储.将这些窗口句柄映射存储在TLS中能够防止其他线程同时访问这些数据. 宏ASSERT_VALID的调用在MFC中相当频繁.这样,如果你调用该宏

C++拾遗--多线程:临界区解决子线程的互斥

C++拾遗--多线程:临界区解决子线程的互斥 前言 为了解决子线程的互斥问题,windows系统提出了关键段或临界区(CRITICAL_SECTION)的概念.它一共有四个共两对操作:初始化.销毁,进入.离开.它们定义在头文件synchapi.h中. 1.初始化变量 VOID WINAPI InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection ); 2.销毁变量 VOID WINAPI DeleteCriticalSect

利用gulp解决微信浏览器缓存问题

做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问题.关于gulp大家可以去gulp官网去详细了解. 这篇文章主要参考于Gulp解决发布线上文件(CSS和JS)缓存问题和Gulp.js----比Grunt更易用的前端构建工具两篇文章,在这里先谢过原作者. 本文主要记录安装gulp以及使用.解决缓存问题的过程,以便日后方便查阅. 1.安装NodeJS

【Java】利用synchronized(this)完成线程的临界区

在<[Java]线程并发.互斥与同步>(点击打开链接)中利用了操作系统通过操作信号量控制的原始方法,完成了线程的互斥与同步,说句题外话,其实这个信号量的算法,是著名的迪杰斯特拉创造的,也就是数据结构.计算机网络上面最短路径算法.迪杰斯特拉算法.Dijkstra算法的贡献人.其实Java里面根本就不需要自己定义一个信号量来实现临界区,Java对于临界区的实现早已封装好了,而且synchronized还是Java的关键字. 那么,到底怎么来使用这个关键字呢?下面就对上次<[Java]线程并发

Android学习:AsyncTask方案解决UI线程阻塞

post方式能解决UI线程阻塞问题,但是代码的可读性较差. 一:看程序 二:定义AsyncTask private class testTask extends AsyncTask<String, Void, Integer> { protected Integer doInBackground(String... arg0) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace();