SimpleDateFormat线程不安全性探讨

PCIE总线及其PCIE SWITCH的使用 PCIe总线与PCI最大的区别在工作原理上,PCIe是采用点到点的串行方式进行传输的,被称为“串行PCI”,由于采用了串行方式传输使得其工作频率可以达到2.5Ghz,大大增加了传输速率,同时采用全双工的通信方式,使得其传输速度提高了一倍,每一个PCIe总线设备与外部通信时有四根数据总线,分别有两个RX和TX,两根用于发送,两根由于接收。PCIe switch中文翻译为PCIe开关或PCIe交换机,主要作用将PCIe设备互联,PCIe switch芯片与其设备的通信协议都是PCIe; 阅读详情

为什么SimpleDateFormat是线程不安全的?

因为SimpleDateFormat中有一个对象为Calendar,这个类在format中的作用就是将日期转换为字符串,而在转换过程中会涉及到一个方法:

xxx 此处省去一堆字
calendar.setTime(date);
xxxx 此处省去一堆字

该方法就是将传入的date放入calendar内,试想,如果一个线程将date放入了,然后立刻切换到另一个线程,另一个线程就会将calendar中的date覆盖。这样一来,所做的转换肯定就是不准确的啦。

SimpleDataFormat在什么情况下使用是不安全的?

1、如果实例是单例,那么SimpleDataFormat作为成员变量就是不安全的。

比如下面这个例子:

public class MyThread implements Runnable {
    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd,HHmmss");

    @Override
    public void run() {
        while (true) {
            try {

                String date = simpleDateFormat.format(new Date(Math.abs(new Random().nextLong())));
                System.out.println("日期为:" + date);
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(1);
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        new Thread(myThread).start();
        new Thread(myThread).start();

    }
}

一起来看下结果喽:

日期为:948621410818,224915
java.lang.ArrayIndexOutOfBoundsException: 5595819
	at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:453)
	at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2397)
	at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2312)
	at java.util.Calendar.complete(Calendar.java:2268)
	at java.util.Calendar.get(Calendar.java:1826)
	at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1119)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
	at java.text.DateFormat.format(DateFormat.java:345)
	at com.kk.test.MyThread.run(MyThread.java:23)
	at java.lang.Thread.run(Thread.java:748)

一起来分析一下,如果是单例,则实例化过程是在堆上分配内存,所以simpleDateFormat也是在堆上分配的。而每个线程都有自身的虚拟机栈,每次需要simpleDateFormat的时候,它会将其从内存中加载进虚拟机栈里面。但是线程可能会修改堆中的值,所以,一个线程使用完后,另一个线程很容易加载错误的date。

2、如果实例是多例,那么如果SimpleDateFormat定义为static时,也是会出现问题的。因为static方法是在方法区分配内存的,多个实例是共享的,所以即使是多例模式,其还是很容易修改SimpleDateFormat里面的值的。

如何解决线程安全问题?

很简单,只需将其放入ThreadLocal里面就行了,ThreadLocal就是线程私有的,也类似于一个Map,每个线程都有自己的内存空间,各个线程间是不会出现共享情况发生的。

public class MyThread implements Runnable {
    private ThreadLocal threadLocal = new ThreadLocal() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyyMMdd,HHmmss");
        }
    };

    @Override
    public void run() {
        while (true) {
            try {

                String date = ((SimpleDateFormat)threadLocal.get()).format(new Date(Math.abs(new Random().nextLong())));
                System.out.println("日期为:" + date);
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(1);
            }
        }
    }
}

 

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇 YOLOv5知识蒸馏教程 阅读详情

相关推荐

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 372

SimpleDateFormat 线程不安全问题及解决方案

零、概述 任何线程不安全的问题,其实本质就是共用了一份数据且没有进行加锁同步,SimpleDateFormat 也是一样。 一、错误案例 public class Test { static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(St...

wenniuwuren 1321

A robust and easy to implement method for IMU calibration without external equipments(IMU标定)

A robust and easy to implement method for IMU calibration without external equipments 1 标定原理1 亲试可用,还有动态演示效果不错。相比商用产品的简易标定流程,该标定方法有以下几点不同: 给出了加速度计和陀螺仪更复杂的模型。 利用Allan方差的定义,标定陀螺仪的偏置。 大量冗余数据,保证最优化收敛。利用数十...

擦擦擦大侠的博客 3947

java.lang.ArrayIndexOutOfBoundsException in BaseCalendar

[code="java"]java.lang.ArrayIndexOutOfBoundsException: 14 at sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate(BaseCalendar.java:436) at java.util.GregorianCalendar.compute...

mangmang 1210

从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录

本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。

weixin_30235225的博客 400

UART全功能测试指南:环路/DMA/RS485/硬件流控实战

UART(通用异步收发器)是嵌入式系统中最基础的串行通信接口,其核心原理基于起始位、数据位、校验位与停止位的异步帧结构,依赖精确的波特率时钟同步与采样重建机制。在工业与物联网场景中,UART不仅需保障基本通信可靠性,更需支持DMA卸载、RS485半双工自动方向控制、RTS/CTS硬件流控等进阶能力,以提升实时性、抗干扰性与系统资源效率。典型应用涵盖调试日志输出、传感器数据采集、Modbus RTU总线通信及固件空中升级。本指南聚焦UART外设测试实践,覆盖环路自检、DMA吞吐验证、RS485时序对齐、硬件流

weixin_42599908的博客 133

找bug记

上周在线上系统发现了两个bug,值得记录下查找的过程和原因。以后如果还有查找bug比较有价值的经历,我也会继续分享。 第一个bug的起始,是在线上日志发现一个频繁打印的异常——java.lang.ArrayIndexOutOfBoundsException。但是却没有堆栈,只有一行一行的ArrayIndexOutOfBoundsException。没有堆栈,不知道异常是从什么地方抛出来的,也就不能

酒中仙的专栏 900

2026年佰维存储数字IC笔试试卷带答案

建立时间是有效时钟沿到来前,输入数据必须稳定保持的最短时间。保持时间是有效时钟沿到来后,输入数据必须继续稳定保持的最短时间。

Open 103

SimpleDateFormat线程安全问题探究

在多个线程共享SimpleDateFormat时,同时也共享了Calendar引用,在如上代码中,calendar首先会进行clear()操作,然后进行set操作,在多线程情况下,set操作会覆盖之前的值,而且在后续对日期进行操作时,也可能会因为clear操作被清除导致异常。SimpleDateFormat继承了DateFormat,DateFormat内部有一个Calendar对象的引用,主要用来存储和SimpleDateFormat相关的日期信息。不仅有的线程结果不正确,甚至还有一些线程还出现了异常!

sloveb123的博客 371

传导案例:某医疗仪器传导骚扰整改案例

紫外线光疗仪是一种专业的医疗设备,主要用于治疗银屑病、白癜风等皮肤疾病。该设备采用物理治疗技术,通过特定波长的紫外线照射人体来达到治疗效果。自1984年窄谱中波紫外线(NB-UVB)应用于临床以来,该技术已成为治疗早期蕈样肉芽肿(MF)的有效方法之一。作为二类医疗器械,紫外线光疗仪必须符合严格的电磁兼容性(EMC)标准,这不仅关系到设备自身的稳定运行,更关乎患者的使用安全和治疗效果。紫外线光疗仪传导骚扰整改案例充分展示了系统性EMC设计的重要性。

m0_56451176的博客 338

Plant Simulation智能行车/天车/起重机建模(1)-基本对象说明

摘要: MultiPortalCrane(多门式起重机)是一种灵活物料搬运设备,适用于造船、钢铁等行业,支持零件预组装、钢板/钢卷智能料场管理及设备装卸。其特点包括: 多门架协同:支持同轨道多门架运行,内置防撞检测; 模块化控制:可独立调节门架、小车及吊钩的速度、加速度和悬臂长度; 多样化搬运:通过目标位置设置或连接器实现零件运输; 故障与统计:可配置MTTR和可用率,实时监控各部件状态。 通过对话框可自定义轨道尺寸、门架数量及运动参数,并支持编程调用(如getPortals方法)。适用于需高精度定位和协同

qq_31964455的博客 313

关于jdk1.7的SimpleDateFormat类线程不安全

项目中,经常会用到日期操作。今天在项目中,运行发现多线程调用SimpleDateFormat,抛出异常的情况,而且是选择性的抛出,实际环境很难复现。 我们模拟以下2种场景: a、单实例场景1: final DateFormat df = new SimpleDateFormat("yyyyMMdd,HHmmss"); ExecutorService ts ...

ainens006679的博客 194

2024年03月CCF-GESP编程能力等级认证Python编程五级真题解析

下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 ,则图中菱形框中应该填入( )。 A. (yr % 400 == 0) or (yr % 4 == 0) B. ( yr % 400 == 0) or (yr % 4 == 0 and yr %100 != 0) C. ( yr % 400 == 0) and ( yr % 4 == 0) D. (yr % 400 == 0) and (yr % 4 == 0 and yr % 100 != 0)

人生就是一个不断学习的过程 744

SimpleDateFormat以及线程安全

项目中,当多线程处理Date与String互相转换的时候,会出现ParseException转换异常。接着百度了一下,记录这个问题。 先贴一下原来的代码 处理的工具类 DateUtil public class DateUtil { private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(...

chengyingdong111的博客 257

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java中SimpleDateFormat线程安全问题及解决方案

最近看到一篇文章提到了SimpleDateFormater这个类。说这个类在单线程程序中没问题,但是在多线程环境下会线程安全的问题。 出于兴趣对这个问题进行了查证。网上有很多关于这个问题的文章,也解析了其中的原因。主要原因是因为SimpleDateFormat转换日期是通过Calendar对象来操作的,SimpleDateFormat继承DateFormat类,DateFormat类中维护一个Calendar对象,当多个线程同时操作这个对象时就会出现问题。 那么解决的办法呢?。有以下几种 1.在使用Simp

qq_43842093的博客 5800

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SimpleDateFormat与DateTimeFormatter

最近在项目中,涉及到日期转换以及多线程的一些问题。如果不涉及到多线程,则两者都可放心大胆的用。但是涉及到多线程的问题,就得注意下了,SimpleDateFormat是线程不安全。 1.何谓线程不安全? 多线程的执行并不是一个线程一个线程的顺序执行,而是相互抢夺cpu资源,拿到资源的就会执行。正式这个特点,如果这两个线程有一个公共的变量,一个线程读取变量并对变量做修改,那么另外一个线程两次访问的变量就会不同。 2.为什么simpleDateFormat是线程不安全? 我们先得看simpleDateFormat

xiaoliuxiix的博客 809

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA - SimpleDateFormat 的线程不安全性

这是我参与更文挑战的第13天,活动详情查看:更文挑战 线程不安全验证 SimpleDateFormat线程不安全验证实验: package cn.xxxx.concurrentdate; import java.text.SimpleDateFormat; import java.util.Date; public class ConcurrentDateTest { private static final SimpleDateFormat simpleDateFormat = new .

阿星君 235

SimpleDateFormat线程不安全原因及解决方案

线程不安全验证: /** * SimpleDateFormat线程安全测试 * 〈功能详细描述〉 * * @author 17090889 * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class SimpleDateFormatTest { private SimpleDateFormat...

weixin_33858336的博客 221

日期格式化:SimpleDateFormat【线程不安全】、FastDateFormat和Joda-Time【后两个都是线程安全】...

SimpleDateFormat是线程不安全的,不能多个线程公用。而FastDateFormat和Joda-Time都是线程安全的,可以放心使用。 SimpleDateFormat是JDK提供的,不需要依赖第三方jar包,而其他两种都得依赖第三方jar包。 FastDateFormat是apache的commons-lang3包提供的 Joda-Time需要依赖以下maven的配置...

weixin_30848775的博客 523

simpleDateFormat线程不安全

一、为什么线程不安全 SimpleDateFormat被定义为static,那么多个线程共用,就会导致线程不安全,但是SimpleDateFormat被声明局部变量,一个线程使用一个SimpleDateFormat就不会导致线程不安全 二、如何线程才安全,推荐使用ThreadLocal package com.example.dateTest; import java.text.DateFormat; import java.text.ParseException; import java.te

qq_37155198的博客 3126

simpledateformat线程为什么不安全

simpledateformat线程为什么不安全 原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time被别的线程修改,因此线程是不安全的。 本教程操作环境:windows7系统、java8版、DELL G3电脑。 线程不安全验证: /** * SimpleDateFormat线程安全测试 * 〈功能详细描述〉 * * @author

840

线程不安全的SimpleDateFormat

转自:https://www.jianshu.com/p/d9977a048dab 8.5 SimpleDateFormat是线程不安全的 SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以...

u012501054的博客 135

SimpleDateFormat有哪些线程安全问题

SimpleDateFormat类的实例是线程不安全的,因为SimpleDateFormat类的内部维护了一个calendar对象,在多线程环境下,多个线程同时访问同一个SimpleDateFormat实例会导致calendar对象的状态混乱,进而导致解析和格式化的结果不正确。总结起来,为了避免SimpleDateFormat的线程安全问题,最好的方法是使用ThreadLocal将SimpleDateFormat实例与线程绑定,以确保每个线程都有自己的SimpleDateFormat实例。

alex6586的博客 372

java的SimpleDateFormat线程不安全出问题了,项目不支持java8,虚竹教你这一招

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!是必不可少的。

2401_84411847的博客 872

SimpleDateFormat线程不安全验证和解决办法

一、背景 在项目中,很多的地方使用到了SimpleDateFormat,用于解析时间非常的方便。日常开发过程测试,通常单元测试,或者QA测试,基本上都是单线程的,难以覆盖到多线程的测试场景;由于很多公司的并发度并不高,那么长时间也没有出现问题,这个问题比较简单又容易被大家忽略。 二、原理 SimpleDateFormat多线程不安全的核心原因,是内部实现用了calendar对象进行赋值,对于同一个SimpleDateFormat在多线程场景下进行赋值,就会相互覆盖,但是程序又能正常...

张立权的技术博客 361

不简单的 SimpleDateFormat

点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!事实证明,Java 的 SimpleDateFormat 并没有那么简单。格式化和解析日期是个(痛苦的)日...

程序猿DD 586
上一篇: 类加载机制
下一篇: Spring中的线程安全问题
心潮逐浪
博客等级 码龄15年 5粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值