博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SimpleDateFormat的线程安全问题
阅读量:6323 次
发布时间:2019-06-22

本文共 1848 字,大约阅读时间需要 6 分钟。

hot3.png

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

报错代码:

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 Examplepublic class MyClass {  static private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss");  // Noncompliant  static private Calendar calendar = Calendar.getInstance();  // NoncompliantCompliant Solutionpublic 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");

搞定,不再报错了。

 

参考好文:

 

  • 20190605更新

java1.8提供了新的时间处理包java.time。可使用java.time.format.DateTimeFormatter格式化时间,如:

/**	 * 时间戳数字格式化成指定格式.	 * 	 * @param milliTimestamp 时间戳	 * @param pattern        时间格式	 * @return	 */	public static String format(long milliTimestamp, String pattern) {		return DateTimeFormatter.ofPattern(pattern)				.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(milliTimestamp), ZoneId.systemDefault()));	}

 

转载于:https://my.oschina.net/woooooody/blog/1477120

你可能感兴趣的文章
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
男人要内在美,更要外在美
查看>>
app启动白屏
查看>>
Hadoop集群完全分布式安装
查看>>
QString,char,string之间赋值
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
wordpress admin https + nginx反向代理配置
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
浅谈代理
查看>>
基于jquery实现的超酷动画源码
查看>>
Factorialize a Number
查看>>
防HTTP慢速攻击的nginx安全配置
查看>>
Spring Boot2.0+中,自定义配置类扩展springMVC的功能
查看>>
参与博客编辑器改版,我的礼物 感谢51cto
查看>>
JavaWeb笔记——JSTL标签
查看>>
一些实用性的总结与纠正
查看>>
HTML5基础(二)
查看>>
ue4(c++) 按钮中的文字居中的问题
查看>>