DateFormat 线程不安全
时间:2022-04-27
本文章向大家介绍DateFormat 线程不安全,主要内容包括一、测试、二、简单分析、三、解决方案、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、测试
测试代码如下:
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws ParseException{
for (int i = 0; i < 2; i++) {
Thread t = new Thread(new TestRunnable(), "t-" + i);
t.start();
}
}
static class TestRunnable implements Runnable {
@Override
public void run() {
while(true) {
long dateTime = 0;
String dateStr = "2016-05-09 08:21:02";
try{
Date dt = sdf.parse(dateStr);
dateTime = dt.getTime();
} catch(Exception e){
e.printStackTrace();
}
if(dateTime < 0) {
System.out.println(dateTime);
}
}
}
}
输出结果:
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:453)
at java.lang.Long.parseLong(Long.java:483)
at java.text.DigitList.getLong(DigitList.java:194)
at java.text.DecimalFormat.parse(DecimalFormat.java:1316)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2088)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at java.text.DateFormat.parse(DateFormat.java:355)
-125744830738000
-61916917138000
-61916917138000
at com.tiza.ngp.rp.sanhui.util.Utils$TestRunnable.run(Utils.java:214)
at java.lang.Thread.run(Thread.java:745)
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:453)
结果要么抛异常,要么结果为错误的负值。
二、简单分析
public abstract class DateFormat extends Format {
/**
* The {@link Calendar} instance used for calculating the date-time fields
* and the instant of time. This field is used for both formatting and
* parsing.
*
* <p>Subclasses should initialize this field to a {@link Calendar}
* appropriate for the {@link Locale} associated with this
* <code>DateFormat</code>.
* @serial
*/
protected Calendar calendar;
...
}
DateFormat类使用了Calendar对象来维护parse和format过程中的日期时间值,当多线程同时使用同一个DateFormat对象,也就是多线程同时使用同一个Calendar对象来维护parse或format过程的日期时间值,必定会发生错乱。
引用Java api文档:
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.
三、解决方案
使用中要么为每个线程创建一个DateFormat实例,要么对其外部加锁。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php日志函数error_log用法实例分析
- Laravel 实现关系模型取出需要的字段
- php设计模式之职责链模式定义与用法经典示例
- php实现多站点共用session实现单点登录的方法详解
- php实例化一个类的具体方法
- PHP MVC框架中类的自动加载机制实例分析
- smarty模板的使用方法实例分析
- 关于Yii中模型场景的一些简单介绍
- php文件包含的几种方式总结
- 一个基于Laravel5的个人博客系统:Lablog搭建教程
- php快速导入大量数据的实例方法
- Laravel 模型关联基础教程详解
- yunBT:一个基于TP3.1的多用户BT离线下载程序,支持在线播放
- 使用Chihaya搭建一个可以屏蔽迅雷的Tracker
- [jio本]Debian9一键安装各种下载工具