文档章节

SimpleDateFormat的线程安全问题

woooooody
 woooooody
发布于 2017/07/21 15:09
字数 315
阅读 18
收藏 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
博文 13
码字总数 5855
作品 0
成都
程序员

暂无文章

活动推荐|互联网3.0与区块链新时代论坛(北京)

1 时间地点 **时间:**9月22日 14:00 - 18:00 地点:(北京海淀)西大街70号 3w咖啡 二层 2 活动详情 Harmony创始人Stephen及团队将介绍他们的区块链分片扩容技术。Stephen曾任Apple地图服务...

HiBlock
39分钟前
1
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
49分钟前
1
0
spring cloud学习笔记

工具 eclipse 4.9 gradle 4.10.2 spring cloud Finchley.SR1 spring boot 2.0.4 build.gradle buildscript {ext {springBootVersion = '2.0.4.RELEASE'}repositories {jcenter()......

bobby2006
51分钟前
1
0
Tcl命令操作实验-----(5)

Vivado% proc myproc {arg} {puts $arg}Vivado% myproc mynamemynameVivado% if {2>1} {puts 2>1} else {puts 2<1}2>1...

whoisliang
今天
1
0
比特币钱包RPC的PHP调用方法

当我们希望在Php开发的网站中加入比特币支付功能时,需要解决的第一个 问题,就是如何在Php程序代码中调用比特币钱包的RPC API开发接口来实现 我们期望的功能,例如比特币的支付与接收。 例如...

汇智网教程
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部