iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >simpledateformat线程不安全的原因
  • 390
分享到

simpledateformat线程不安全的原因

2023-06-15 00:06:12 390人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关simpledatefORMat线程不安全的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象

这篇文章将为大家详细讲解有关simpledatefORMat线程安全的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time被别的线程修改,因此线程是不安全的。

教程操作环境:windows7系统、java8版、DELL G3电脑。

线程不安全验证:

public class SimpleDateFormatTest {    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(1000), new MyThreadFactory("SimpleDateFormatTest"));    public void test() {        while (true) {            poolExecutor.execute(new Runnable() {                @Override                public void run() {                    String dateString = simpleDateFormat.format(new Date());                    try {                        Date parseDate = simpleDateFormat.parse(dateString);                        String dateString2 = simpleDateFormat.format(parseDate);                        System.out.println(dateString.equals(dateString2));                    } catch (ParseException e) {                        e.printStackTrace();                    }                }            });        }    }

输出:

  true  false  true  true  false

出现了false,说明线程不安全

format方法

public StringBuffer format(Date date, StringBuffer toAppendTo,                               FieldPosition pos)    {        pos.beginIndex = pos.endIndex = 0;        return format(date, toAppendTo, pos.getFieldDelegate());    }    // Called from Format after creating a FieldDelegate    private StringBuffer format(Date date, StringBuffer toAppendTo,                                FieldDelegate delegate) {        // Convert input date to time field list        calendar.setTime(date);        boolean useDateFormatSymbols = useDateFormatSymbols();        for (int i = 0; i < compiledPattern.length; ) {            int tag = compiledPattern[i] >>> 8;            int count = compiledPattern[i++] & 0xff;            if (count == 255) {                count = compiledPattern[i++] << 16;                count |= compiledPattern[i++];            }            switch (tag) {            case TAG_QUOTE_ASCII_CHAR:                toAppendTo.append((char)count);                break;            case TAG_QUOTE_CHARS:                toAppendTo.append(compiledPattern, i, count);                i += count;                break;            default:                subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);                break;            }        }        return toAppendTo;    }
 protected Calendar calendar;

可以看到,多个线程之间共享变量calendar,并修改calendar。因此在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time被别的线程修改,因此线程是不安全的。

此外,parse方法也是线程不安全的,parse方法实际调用的是CalenderBuilder的establish来进行解析,其方法中主要步骤不是原子操作。

解决方案:

  1、将SimpleDateFormat定义成局部变量

  2、 加一把线程同步:synchronized(lock)

  3、使用ThreadLocal,每个线程都拥有自己的SimpleDateFormat对象副本。如:

public class SimpleDateFormatTest {        private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {        @Override        protected SimpleDateFormat initialValue() {            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        }    };    //    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(1000), new MyThreadFactory("SimpleDateFormatTest"));    public void test() {        while (true) {            poolExecutor.execute(new Runnable() {                @Override                public void run() {                    SimpleDateFormat simpleDateFormat = THREAD_LOCAL.get();                    if (simpleDateFormat == null) {                        simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");                    }                    String dateString = simpleDateFormat.format(new Date());                    try {                        Date parseDate = simpleDateFormat.parse(dateString);                        String dateString2 = simpleDateFormat.format(parseDate);                        System.out.println(dateString.equals(dateString2));                    } catch (ParseException e) {                        e.printStackTrace();                    } finally {                        local.remove();                    }                }            });        }    }}

  4、使用DateTimeFormatter代替SimpleDateFormat

  DateTimeFormatter是线程安全的,默认提供了很多格式化方法,也可以通过ofPattern方法创建自定义格式化方法。

  (1)格式化日期示例:

 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime); // 2019-11-20T15:04:29.017 DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); String strDate=localDateTime.format(dtf); System.out.println(strDate); // 2019/23/20 15:23:46

  (2)解析日期

 DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime localDateTime=LocalDateTime.parse("2019/11/20 15:23:46",dtf); System.out.println(localDateTime); // 2019-11-20T15:23:46

关于“simpledateformat线程不安全的原因”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: simpledateformat线程不安全的原因

本文链接: https://www.lsjlt.com/news/276149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • simpledateformat线程不安全的原因
    这篇文章将为大家详细讲解有关simpledateformat线程不安全的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象...
    99+
    2023-06-15
  • java的SimpleDateFormat线程不安全怎么办
    这篇文章主要为大家展示了“java的SimpleDateFormat线程不安全怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java的SimpleDateFormat线程不安全怎么办”这篇...
    99+
    2023-06-20
  • java线程不安全的原因是什么
    今天就跟大家聊聊有关java线程不安全的原因是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;...
    99+
    2023-06-14
  • java的SimpleDateFormat线程不安全的几种解决方案
    目录场景SimpleDateFormat线程为什么是线程不安全的呢?验证SimpleDateFormat线程不安全解决方案解决方案1:不要定义为static变量,使用局部变量解决方案...
    99+
    2024-04-02
  • 解决Java中SimpleDateFormat线程不安全的五种方案
    目录1.什么是线程不安全? 线程不安全的代码 2.解决方案 ① 将SimpleDateFormat变为局部变量 ② 使用synchronized加锁 ③ 使用Lock加锁 ④ 使用T...
    99+
    2024-04-02
  • StringBuilder是线程不安全的原因是什么
    这篇文章主要介绍了StringBuilder是线程不安全的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇StringBuilder是线程不安全的原因是什么文章都会有所收获,下面我们一起来看看吧。原因分...
    99+
    2023-06-27
  • 如何解决Java中SimpleDateFormat线程不安全的问题
    这篇文章将为大家详细讲解有关如何解决Java中SimpleDateFormat线程不安全的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.什么是线程不安全?线程不安全也叫非线程安全,是指多线程执行中...
    99+
    2023-06-15
  • Java SimpleDateFormat线程不安全问题怎么解决
    本篇内容主要讲解“Java SimpleDateFormat线程不安全问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SimpleDateFormat线程...
    99+
    2023-07-05
  • SimpleDateFormat线程安全问题排查详解
    目录一. 问题现象二. 原因排查三. 原因分析四. 解决方案一. 问题现象 运营部门反馈使用小程序配置的拉新现金红包活动二维码,在扫码后跳转至404页面。 二. 原因排查 首先,检查...
    99+
    2022-11-13
    SimpleDateFormat线程安全排查 SimpleDateFormat线程安全
  • 深入探究Java线程不安全的原因与解决
    目录一、什么是线程安全二、线程不安全的原因1、修改共享数据2、原子性3、内存可见性4、指令重排序三、解决线程安全方案一、什么是线程安全 想给出一个线程安全的确切定义是复杂的,但我们可...
    99+
    2024-04-02
  • 详解SimpleDateFormat的线程安全问题与解决方案
    1. 原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日...
    99+
    2023-05-31
    simpledateformat 线程 dat
  • java中SimpleDateFormat非线程安全问题的示例分析
    小编给大家分享一下java中SimpleDateFormat非线程安全问题的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!SimpleDateFormat非线程安全问题实现1000个线程的时间格式化package&...
    99+
    2023-06-20
  • 面试Spring中的bean线程是否安全及原因
    目录SpringBean作用域spring单例,为什么controller、service和dao确能保证线程安全?@Controller@Service是不是线程安全的?总结面试官...
    99+
    2024-04-02
  • 说redis是安全的原因
    小编给大家分享一下说redis是安全的原因,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们可以通过 redis 的配置文件设置...
    99+
    2024-04-02
  • JavaSimpleDateFormat线程不安全问题
    目录多线程 ——SimpleDateFormat原因分析解决方法解决方法1解决方法2总结多线程 ——SimpleDateFormat ...
    99+
    2023-03-24
    Java多线程不安全 SimpleDateFormat线程不安全
  • Java线程之安全与不安全的示例分析
    这篇文章将为大家详细讲解有关Java线程之安全与不安全的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说Stri...
    99+
    2023-05-30
    java
  • Java线程安全与不安全实例分析
    本篇内容主要讲解“Java线程安全与不安全实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程安全与不安全实例分析”吧!当我们查看JDK API的时候,总会发现一些类说明写着,线程...
    99+
    2023-06-17
  • Java线程安全中的原子性浅析
    目录何为原子性解决方法CAS机制(Compare And Swap)何为原子性 原子性:一条线程在执行一系列程序指令操作时,该线程不可中断。一旦出现中断,那么就可能会导致程序执行前后...
    99+
    2023-02-21
    Java线程原子性 Java线程安全原子性
  • 电脑安全模式进不去的原因有哪些
    电脑安全模式无法进入的原因可能有以下几个:1. 按键操作错误:在启动时按下的F8键或Shift键可能没有按到或者按错了。2. 系统故...
    99+
    2023-09-20
    电脑
  • Java线程安全中的原子性是什么
    本篇内容介绍了“Java线程安全中的原子性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为原子性原子性:一条线程在执行一系列程序指令...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作