文档章节

SimpleDateFormat的线程安全问题

woooooody
 woooooody
发布于 2017/07/21 15:09
字数 315
阅读 29
收藏 1

今天用代码测试工具时,发现我的代码中存在这么一个问题,还不能忽略.

报错代码:

public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

工具的提示为:

Not all classes in the standard Java library were written to be thread-safe. Using them in a multi-threaded manner is highly likely to cause data problems or exceptions at runtime.

This rule raises an issue when an instance of Calendar, DateFormat, javax.xml.xpath.XPath, or javax.xml.validation.SchemaFactory is marked static.

Noncompliant Code Example

public class MyClass {
  static private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss");  // Noncompliant
  static private Calendar calendar = Calendar.getInstance();  // Noncompliant

Compliant Solution

public class MyClass {
  private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss");
  private Calendar calendar = Calendar.getInstance();

原因是SimpleDateFormat类是线程不安全的。这一点其实在JDK中也有提醒:

       JDK原始文档如下:
  Synchronization:
  Date formats are not synchronized. 
  It is recommended to create separate format instances for each thread. 
  If multiple threads access a format concurrently, it must be synchronized externally.

由于本次程序并发程度较高,且时间格式化的使用频率也高,所以不能像以往一样无视这种可能性了。于是可选择的解决方式有:

  • 用的时候new,用一次new一次  - - !
  • synchronized
  • ThreadLocal
  • 放弃SimpleDateFormat

最终我选择了放弃SimpleDateFormat,使用Apache里的FastDateFormat:

public static final FastDateFormat FORMAT=FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

搞定,不再报错了。

 

参考好文:http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

© 著作权归作者所有

共有 人打赏支持
woooooody
粉丝 0
博文 16
码字总数 6994
作品 0
成都
程序员
私信 提问

暂无文章

《告诉你真实的美国教育》的读后感3900字

《告诉你真实的美国教育》的读后感3900字: 文章的开篇分析了我们耳熟能详的关于美国教育的小故事,就是那个因为幼儿园的老师教了“0”这个字母,然后妈妈告老师剥夺了孩子的想象力,再然后幼...

原创小博客
21分钟前
0
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
36分钟前
1
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
47分钟前
1
0
编程价值观、原则、模式

读自《实现模式》 模式,即是针对特定问题的通用解决方案。 每个模式都承载这一点点理论,但实际编程中存在着一些更加深远的影响力,远不是孤立的模式所能概括的。 价值观是编程过程的统一支...

遥借东风
今天
2
0
php分割二级域名做跳转处理方法

使用php中的全局变量 $_SERVER['HTTP_HOST'] ,可以获得用户当前访问的域名字符串,在这里面查询自己定义的各个子域名字符串,然后使用header函数重定向到不同的页面 代码如下 if( strpos($...

Mr_Azaz
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部