SimpleDateFormat线程不安全性的三种方法解决

在java项目中,我们通常会自己写一个dateutil类,处理日期和字符串的转换。如下


 


public class dateutil{
private static simpledateformat sdf = new simpledateformat("yyyymmdd");

public static formatdatetoyyyymmddstr(date date){
return sdf.format(date);
}

public static formatyyyymmddstrtodate(string str){

return sdf.parse(str);
}
}

 

然而,由于simpledateformat类不是线程安全的,所以在多线程的环境下,往往会出现意想不到的结果。

有三种方法可以解决以上问题。

1)每次使用时,都创建一个新的simpledateformat实例。如果使用不是很频繁时,可以使用此方法,这样可以降低创建新对象的开销。

2)使用同步:


public class dateutil{
private simpledateformat sdf = new simpledateformat("yyyymmdd");

private date parse(string datestr) throws parseexception{
synchronized(sdf){
return sdf.parse(datestr);
}
}
private string format(date date){
synchronized(sdf){
return sdf.format(datestr);
}
}
}

不过,当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block,这样的操作也会一定程度上影响性能。

个人最推荐的是第三种方法,那就是借助threadlocal对象每个线程只创建一个实例。



public class dateutil {

private static final string date_format = "yyyymmdd";

@suppresswarnings("rawtypes")
private static threadlocal threadlocal = new threadlocal() {
protected synchronized object initialvalue() {
return new simpledateformat(date_format);
}
};

public static dateformat getdateformat() {
return (dateformat) threadlocal.get();
}

public static date parse(string textdate) throws parseexception {
return getdateformat().parse(textdate);
}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 线程
, class
, 多线程
, static
synchronized
simpledateformat、js simpledateformat、simpledateformat格式、simpledateformat包、simpledateformat api,以便于您获取更多的相关知识。

时间: 2024-09-16 00:18:43

SimpleDateFormat线程不安全性的三种方法解决的相关文章

java多线程编程之向线程传递数据的三种方法_java

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法. 欲先取之,必先予之.一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并

Java多线程初学者指南(7):向线程传递数据的三种方法

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法. 欲先取之,必先予之.一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并

三种方法解决IIS 6 目录检查安全漏洞

iis|安全|安全漏洞|解决 一 . Windows 2003 Enterprise Edition IIS6 目录检查漏洞的描述 1.Windows 2003 Enterprise Edition是微软目前主流的服务器操作系统. Windows 2003 IIS6 存在着文件解析路径的漏洞,当文件夹名为类似hack.ASP的时候(即文件夹名看起来像一个ASP文件的文件名),此时此文件夹下的任何类型的文件都可以在IIS中被当做ASP程序来执行.这样黑客即可上传扩展名为jpg或gif之类的看起来像

三种方法解决IIS6目录检查漏洞

iis|解决 一 . Windows 2003 Enterprise Edition IIS6 目录检查漏洞的描述 1.Windows 2003 Enterprise Edition是微软目前主流的服务器操作系统. Windows 2003 IIS6 存在着文件解析路径的漏洞,当文件夹名为类似hack.ASP的时候(即文件夹名看起来像一个ASP文件的文件名),此时此文件夹下的任何类型的文件都可以在IIS中被当做ASP程序来执行.这样黑客即可上传扩展名为.jpg或.gif之类的看起来像是图片文件的

三种方法解决关闭xp自动更新工具的问题

  方法一 鼠标左键点击桌面左下角的开始菜单按钮,然后在出现的上拉菜单上面点击设置,然后在设置的侧拉菜单上面点击控制面板 点击控制面板以后会出现控制面板窗口,在控制面板窗口里面点击安全中心 点击安全中心以后会出现Windows安全中心窗口,在安全中心窗口上面点击自动更新 点击自动更新以后会出现自动更新窗口,在自动更新窗口下面点击选中关闭自动更新然后点击确定就可以了 方法二 鼠标右键点击我的电脑图标,会出现侧拉菜单,然后在侧拉菜单上面鼠标点击属性 点击属性以后会出现系统属性窗口,在系统属性窗口上面

OpenJudge 2746(三种方法解决Joseph问题)

#include<stdio.h> #include<string.h> int vis[310]; void joseph(int n,int m) { int i,j,k; int cnt=0,count=0; memset(vis,0,sizeof(vis));//0表示未选中 for(i=1;count<n-1;i=i%n+1)//循环 n-1次 { if(vis[i]==0) { // vis[i]=1; cnt++; } if(m==cnt) { vis[i]=1

改善云迁移安全性最有效的三种方法

对于企业来讲,将IT系统迁移至云端进行交付是一种行业趋势.为什么会出现云端迁移这一趋势呢?成本效益和业务便捷是驱动企业CIO采取云端迁移的主要动力.目前,大部分现代企业已经开始着手向公有云迁移. 在云迁移过程中,从基础设施的部署到云托管平台的跳转,比如法规.数据治理.账单和成本管理,都是十分具有挑战性的.因此,在迁移过程中,公司CIO首要考虑的任务之一就是:尽量减少迁移风险. LinkedIn信息安全社区的一项调查显示,49%的CIO和企业认为,影响他们采用云计算的主要原因之一是担心数据的丢失和

AJAX实现跨域的三种方法(代理,JSONP,XHR2)_AJAX相关

域: 域是WIN2K网络系统的安全性边界.我们知道一个计算机网最基本的单元就是"域",这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域.在独立的计算机上,域即指计算机本身,一个域可以分布在多个物理位置上,同时一个物理位置又可以划分不同网段为不同的域,每个域都有自己的安全策略以及它与其他域的信任关系.当多个域通过信任关系连接起来之后,活动目录可以被多个信任域域共享. 由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只

在IOS中为什么使用多线程及多线程实现的三种方法_IOS

多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI