java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量
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、方法内变量的更多相关文章
- java的多线程:线程安全问题
什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. 抢火车的例子: ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- Java 中线程安全问题
不好意思,一个国庆假期给我放的都不知道东西南北了,放松,很放松,差一点就弃更了,感谢那些催更的小伙伴们! 虽然没有更新,但是日常的学习还是有的,以后我尽量给大家分享一些通用知识,非技术. 但是本期还是 ...
- Java基础-线程安全问题汇总
Java基础-线程安全问题汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存泄漏和内存溢出(out of memory)的区别 1>.什么是内存溢出 答:内存溢出指 ...
- Java多线程--线程安全问题的相关研究
在刚刚学线程的时候我们经常会碰到这么一个问题:模拟火车站售票窗口售票.代码如下: package cn.blogs.com.isole; /* 模拟火车站售票窗口售票,假设有50张余票 */ publ ...
- Java多线程——线程安全问题
一.什么情况下会产生线程安全问题? 同时满足以下两个条件时: 1,多个线程在操作共享的数据.2,操作共享数据的线程代码有多条. 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导 ...
- 再次理解多线程线程安全问题(理解java内存模型后)
1.多线程访问的共享资源存在线程安全问题, 无外乎访问两种共享资源. 1)多线程访问方法区数据.存在线程安全问题,通过加锁 2)多线程访问实例变量:被访问对象是单例时存在线程安全,被访问对象是多例时, ...
- 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),
1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...
- Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用
首先了解什么是多线程与进程 进程:是一个执行过程,动态的概念 --->会分配内存线程:是进程的一个单元,线程是系统最小的执行单元 详解: http://blog.csdn.net/luoweif ...
随机推荐
- 『学了就忘』Linux用户管理 — 52、用户组管理相关命令
目录 1.添加用户组 2.删除用户组 3.把用户添加进组或从组中删除 4.有效组(了解) 1.添加用户组 添加用户组的命令是groupadd. 命令格式如下: [root@localhost ~]# ...
- 解决springboot启动日志异常问题
问题描述:springboot启动异常,启动后没有日志打印. 问题原因:slf4j日志实现重复,找不到对应实现类. 问题应对: 1. 是不是项目没起来---->打印的日志数据,到这里就不打印了, ...
- ROS机器人开发实践1->SSH远程登录要点记录
1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...
- 在linux下查看python已经安装的模块
一.命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交互解释器中使用help()查看 python--->在交互式解释器中输入>> ...
- 02 Windows安装C语言开发工具CodeBlocks
CodeBlocks安装 使用微信扫码关注微信公众号,并回复:"C语言环境",免费获取下载链接! 1.卸载CodeBlocks(电脑未装此软件,跳过) 进入目录:C:\Pro ...
- Vue2全家桶+Element搭建的PC端在线音乐网站
目录 1,前言 2,已有功能 3,使用 4,目录结构 5,页面效果 登录页 首页 排行榜 歌单列表 歌单详情 歌手列表 歌手详情 MV列表 MV详情 搜索页 播放器 1,前言 项目基于Vue2全家桶及 ...
- accomplish, accord
accomplish =achieve; accomplishment=achievement. accomplished: well educated/trained, skilled. skill ...
- R语言学习记录(一)
(R基础) 对象:什么是对象呢,其实就是一个名称而已,在R中存储的数据 就是一个R对象 a <- 1 ###其中'<-'表示的是一个赋值符号 这句话表示的是,将1赋值给a b <- ...
- 零基础学习java------day10------带包编译,权限修饰符,内部类,调式,junitTest
0. 带包编译 解决使用notepad++编写的java类中如果有package的解决方案,如下代码 package com._51doit.test; class HelloWorld{ publ ...
- Rust 总章
1.1 Rust安装 3.5 Rust Generic Types, Traits, and Lifetimes 3.6 String 与 切片&str的区别 https://openslr. ...