SimpleDateFormat多线程中执行报错

  • java.lang.NumberFormatException: For input string: ""  

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.*; /**
    * @ClassName VarNotSafeDateFormat
    * @projectName: object1
    * @author: Zhangmingda
    * @description: XXX
    * date: 2021/4/26.
    */
    public class VarNotSafeDateFormat {
    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); //使用共享的共享对象可能报错
    private static class DateFormatTransfer extends Thread{
    private String dateStr; public DateFormatTransfer(String dateStr) {
    this.dateStr = dateStr;
    } @Override
    public void run() {
    // DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); 方法内变量安全,每个线程执行方法的时候独立创建实例
    try {
    Date date = DATE_FORMAT.parse(dateStr);
    String stringDateAfterTrans = DATE_FORMAT.format(date);
    System.out.println(dateStr + "转换后:" + stringDateAfterTrans);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    }
    } public static void main(String[] args) {
    List<String> dates = Arrays.asList("2021-04-21","2021-04-22","2021-04-23","2021-04-24","2021-04-25",
    "2021-04-26","2021-04-27","2021-04-28","2021-04-29","2021-04-30");
    Set<Thread> threads = new HashSet<>();
    dates.forEach(dateStr ->{
    // new DateFormatTransfer(dateStr).start();
    threads.add(new DateFormatTransfer(dateStr));
    });
    threads.forEach(thread -> thread.start());
    }
    }

ThreadLocal 变量 解决方案:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; /**
* @ClassName VarNotSafeDateFormat
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/26.
*/
public class VarNotSafeDateFormat { /**
* ThreadLocal 线程安全变量,和方法变量异曲同工之妙,实际都创建了不同的子实例用
*/
private static final ThreadLocal<DateFormat> DATE_FORMAT_THREAD_LOCAL = new ThreadLocal<>(){
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
}; private static class DateFormatTransfer extends Thread{
private String dateStr; public DateFormatTransfer(String dateStr) {
this.dateStr = dateStr;
} @Override
public void run() {
// DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); 方法内变量安全,每个线程执行方法的时候独立创建实例
try {
Date date = DATE_FORMAT_THREAD_LOCAL.get().parse(dateStr);
String stringDateAfterTrans = DATE_FORMAT_THREAD_LOCAL.get().format(date);
System.out.println(dateStr + "转换后:" + stringDateAfterTrans);
} catch (ParseException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
List<String> dates = Arrays.asList("2021-04-21","2021-04-22","2021-04-23","2021-04-24","2021-04-25",
"2021-04-26","2021-04-27","2021-04-28","2021-04-29","2021-04-30");
Set<Thread> threads = new HashSet<>();
dates.forEach(dateStr ->{
threads.add(new DateFormatTransfer(dateStr));
});
threads.forEach(thread -> thread.start());
}
}

 

java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量的更多相关文章

  1. java的多线程:线程安全问题

    什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. 抢火车的例子: ...

  2. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  3. Java 中线程安全问题

    不好意思,一个国庆假期给我放的都不知道东西南北了,放松,很放松,差一点就弃更了,感谢那些催更的小伙伴们! 虽然没有更新,但是日常的学习还是有的,以后我尽量给大家分享一些通用知识,非技术. 但是本期还是 ...

  4. Java基础-线程安全问题汇总

    Java基础-线程安全问题汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存泄漏和内存溢出(out of memory)的区别 1>.什么是内存溢出 答:内存溢出指 ...

  5. Java多线程--线程安全问题的相关研究

    在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...

  6. Java多线程——线程安全问题

    一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据.2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导 ...

  7. 再次理解多线程线程安全问题(理解java内存模型后)

    1.多线程访问的共享资源存在线程安全问题, 无外乎访问两种共享资源. 1)多线程访问方法区数据.存在线程安全问题,通过加锁 2)多线程访问实例变量:被访问对象是单例时存在线程安全,被访问对象是多例时, ...

  8. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),

    1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...

  9. Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用

    首先了解什么是多线程与进程 进程:是一个执行过程,动态的概念 --->会分配内存线程:是进程的一个单元,线程是系统最小的执行单元 详解: http://blog.csdn.net/luoweif ...

随机推荐

  1. 解决Gitlab的The remote end hung up unexpectedly错误,解决RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large问题

    解决Gitlab的The remote end hung up unexpectedly错误 解决RPC failed; HTTP 413 curl 22 The requested URL retu ...

  2. datamash 命令行下的快速计算工具

    github地址:https://github.com/agordon/datamash

  3. 变量、内存区域、MDK文件(map、htm)

    变量分为:局部变量和全局变量 局部变量:函数体内部定义的变量,作用域为函数内部,static声明(静态局部变量)该变量则函数调用结束后不消失而保留值,分配的存储空间不释放. 全局变量:函数体外部定义的 ...

  4. centos 安装reids

    1.安装tcl支持 yum install tcl 2.安装redis我们以最新的2.8.9为例 $ wget http://download.redis.io/releases/redis-2.8. ...

  5. C++面试基础篇(一)

    1. static关键字的作用 (1)全局静态变量 在全局变量前面加上关键字static, 全局变量就定义为一个全局静态变量 在静态存储区,在整个程序运行期间一致存在. 初始化:未初始化的全局静态变量 ...

  6. 学习java 7.27

    学习内容: 创建树 Swing 使用JTree对象来代表一棵树,JTree树中结点可以使用TreePath来标识,该对象封装了当前结点及其所有的父结点. 当一个结点具有子结点时,该结点有两种状态: 展 ...

  7. Java 监控基础 - 使用 JMX 监控和管理 Java 程序

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章. 此篇文 ...

  8. Vue相关,Vue JSX

    JSX简介 JSX是一种Javascript的语法扩展,JSX = Javascript + XML,即在Javascript里面写XML,因为JSX的这个特性,所以他即具备了Javascript的灵 ...

  9. GO瞬间并发数控制

    var wg2 sync.WaitGroup wg2.Add(nums) xc :=0 parallelNum := plt.MaxParallel var waitCount int32 = 0 f ...

  10. 优化 if-else 代码的 8 种方案

    前言 代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案. 方案. 优化方案一:提前return,去除不必要的el ...