SimpleDateFormat线程不安全的5种解决方案

1.什么是线程不安全?

线程不安全也叫非线程安全,是指多线程执行中,程序的执行结果和预期的结果不符的情况就叫着线程不安全。

线程不安全的代码

SimpleDateFormat 就是一个典型的线程不安全事例,接下来我们动手来实现一下。首先我们先创建 10 个线程来格式化时间,时间格式化每次传递的待格式化时间都是不同的,所以程序如果正确执行将会打印 10 个不同的值,接下来我们来看具体的代码实现:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimpleDateFormatExample {
    // 创建 SimpleDateFormat 对象
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");

    public static void main(String[] args) {
        // 创建线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        // 执行 10 次时间格式化
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            // 线程池执行任务
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    // 创建时间对象
                    Date date = new Date(finalI * 1000);
                    // 执行时间格式化并打印结果
                    System.out.println(simpleDateFormat.format(date));
                }
            });
        }
    }
}

我们预期的正确结果是这样的(10 次打印的值都不同):

SimpleDateFormat线程不安全的5种解决方案

然而,以上程序的运行结果却是这样的:

SimpleDateFormat线程不安全的5种解决方案

从上述结果可以看出,当在多线程中使用 SimpleDateFormat 进行时间格式化是线程不安全的。

2.解决方案

SimpleDateFormat 线程不安全的解决方案总共包含以下 5 种:

  1. 将 SimpleDateFormat 定义为局部变量;
  2. 使用 synchronized 加锁执行;
  3. 使用 Lock 加锁执行(和解决方案 2 类似);
  4. 使用 ThreadLocal;
  5. 使用 JDK 8 中提供的 DateTimeFormat。

接下来我们分别来看每种解决方案的具体实现。

① SimpleDateFormat改为局部变量

将 SimpleDateFormat 定义为局部变量时,因为每个线程都是独享 SimpleDateFormat 对象的,相当于将多线程程序变成”单线程”程序了,所以不会有线程不安全的问题,具体实现代码如下:

Original: https://www.cnblogs.com/rinack/p/14779561.html
Author: 如.若
Title: SimpleDateFormat线程不安全的5种解决方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540303/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JDK成长记9:集合篇的总结和练习

    这一节主要是抛出一些面试题让大家检验一下学习成果,也会小结一下集合篇的知识点。 所以不会特别长。 练习-模拟面试 练习-模拟面试 先给大家讲一个简单的面试场景 快手Java面试一、…

    Java 2023年6月5日
    082
  • 踩坑了!0作为除数,不一定会抛出异常!

    你好呀,我是歪歪。 踩坑了啊,又踩坑了啊! 这次踩到一个特别无语的常识坑。知道真相的那一刻,人就是整个麻掉。 先上个代码: private&#xA0;static&…

    Java 2023年6月5日
    095
  • 笔记:Java集合框架(一)

    Java集合框架(一) Collection接口 继承结构 Iterator接口 Iterator接口定义了迭代器的基本方法: java;gutter:true; hasNext(…

    Java 2023年6月7日
    070
  • Mybatis基础知识大全!!!

    1. 简介 1.1什么是Mybatis 1.2 如何获得Mybatis 1.3 使用Mybatis的好处: 2.初涉Mybatis 2.1环境搭建 2.2、创建一个模块(项目) 2…

    Java 2023年6月8日
    0115
  • springboot跳转页面

    项目结构 java;gutter:true; @Controller public class Jump { @RequestMapping("hah") pu…

    Java 2023年6月5日
    092
  • 经典面试题:重载和重写的区别

    重写(Override) 从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个…

    Java 2023年6月14日
    074
  • [学习笔记] Java抽象类

    抽象类 在Java中所有的对象都是通过类来描述的,但不是所有的类都用于描述对象,抽象类就是这样一种存在; 抽象类不能用于实例化对象,但它也可以拥有普通类一样的成员变量、成员方法和构…

    Java 2023年6月5日
    077
  • 好久不见

    其实真的没想到,自己当初为了帮助自己刷题复习写的博客,能帮助这么多人 大家的消息还有comments我没有一一回复,我表示非常抱歉,因为当找到工作后,就想赶紧换换脑子,休息休息。。…

    Java 2023年5月30日
    093
  • 简单记录下最近面试的几家公司面试经历.(Java一年经验)

    一年经验,记录下最近几家公司的面试经历. 1.深圳缇铭科技有限公司 1)先让自我介绍,讲一下最近的项目 根据项目提问,比如: redis你是如何部署的?你的code是直接套用他们的…

    Java 2023年6月14日
    084
  • 设计模式 15 责任链模式

    责任链模式(Chain of Responsibility Pattern)属于 行为型模式 责任链,即责任的链条,在生活中是很常见的。 比如在工作中提交审批,会经历责任人的层层审…

    Java 2023年6月6日
    064
  • 创建一个springboot工程最小化代码(json-lib的引入gradle方式)

    最小代码的springboot工程: settings.gradle: build.gradle src下的文件: Original: https://www.cnblogs.co…

    Java 2023年5月30日
    078
  • 2021 idea热部署

    依赖 org.springframework.boot spring-boot-devtools runtime true 导入 maven 插件 org.springframew…

    Java 2023年6月16日
    073
  • 5、Math类

    常用方法 //Math 常用方法(静态方法) //1.abs 绝对值 int abs = Math.abs(-9); System.out.println(abs); //2.po…

    Java 2023年6月7日
    083
  • Java中this和super关键字小结

    package com.itheima.test; /** * @author Pzi * @create 2022-09-26 16:23 */ public class A {…

    Java 2023年6月15日
    072
  • BlockingQueue阻塞队列

    BlockingQueue阻塞队列 BlockingQueue的四组API undefined public static void test01(){ ArrayBlocking…

    Java 2023年6月5日
    076
  • 分库分表ShardingSphere-JDBC笔记整理

    一、分库分表解决的现状问题 解决数据库本身瓶颈 连接数: 连接数过多时,就会出现’too many connections’的错误,访问量太大或者数据库设置…

    Java 2023年6月13日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球