SimpleDateFormat 线程不安全原因及解决办法
0.翻车演示:
package com.knowledge.system.a_interview.ai_view;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;/*** @program: demo-pom* @description:* @author: * @create: 2020-08-05 18:44**/
public class ThreadLocalTest {
// private staticpublic static void main(String[] args) throws ExecutionException, InterruptedException {SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");Callable<Date> callable=new Callable<Date>() {@Overridepublic Date call() throws Exception {return simpleDateFormat.parse("2020-09-01");}};ExecutorService pool= Executors.newFixedThreadPool(10);List<FutureTask> futures=new ArrayList<>();for(int i=0;i<100;i++){FutureTask task=new FutureTask(callable);futures.add(task);pool.submit(task);}for (Future future : futures) {System.out.println(future.get());}}
}
1.原因:多线程环境下共享Calendar变量,同时操作calender
format方法:
parse方法:
3.解决办法:
1.ThreadLocal:
package com.knowledge.system.a_interview.ai_view;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;/*** @program: demo-pom* @description:* @author:* @create: 2020-08-05 18:44**/
public class ThreadLocalTest {public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal() {@Overrideprotected SimpleDateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd");}};Callable<Date> callable = new Callable<Date>() {@Overridepublic Date call() throws Exception {SimpleDateFormat simpleDateFormat = threadLocal.get();if (null == simpleDateFormat) {simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");threadLocal.set(simpleDateFormat);}return simpleDateFormat.parse("2020-09-01");}};ExecutorService pool = Executors.newFixedThreadPool(10);List<FutureTask> futures = new ArrayList<>();for (int i = 0; i < 100; i++) {FutureTask task = new FutureTask(callable);futures.add(task);pool.submit(task);}for (Future future : futures) {System.out.println(future.get());}// importantthreadLocal.remove();pool.shutdown();}
}
SimpleDateFormat 线程不安全原因及解决办法相关推荐
- mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法
数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...
- 多线程编程:线程死锁的原因以及解决方法
多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...
- MySQL 主从同步延迟的原因及解决办法
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 MySQL 主从同步延迟的原因及解决办法 hao_yunfeng 2018-09-04 23 ...
- MySQL备库复制延迟的原因及解决办法
背景 今天有同事问我主从复制延迟会影响高可用切换的 RTO 怎么办,这个不需要做实验,我可以直接回答,所以有了以下赶鸭子的文章,都是一线运维经验之谈,建议四连:点赞.收藏.转发.在看. 复制延迟的原因 ...
- c语言野指针导致问题,C语言进阶之路(三)----野指针的产生原因及解决办法
1.会产生野指针的做法 #include //这就是一种错误的写法 int main(){ int *p = NULL; p = (int *)malloc(); //释放P所指向的内存空间,但指针变 ...
- DEV C++编写程序出现 [errror]Id returned 1 exit status报错可能出现的原因及解决办法
前言: 在DEV C++编写程序时总是出现出现 [errror]Id returned 1 exit status报错,但是却找不到任何问题(气死人了),我就为此问题困扰了好几个月,看遍了所有网页.博 ...
- JVM出现OOM的八种原因及解决办法
本文源自转载:JVM出现OOM的八种原因及解决办法 目录 一.堆溢出 1.1 原因 1.2解决方法 二.永久代/元空间溢出 2.1 原因 2.2 解决方法 三.GC overhead limit ex ...
- nginx 502错误原因和解决办法总结
nginx 502错误原因和解决办法总结 一.NGINX 502错误排查 二.Nginx 413错误的排查:修改上传文件大小限制 三.Nginx 400错误排查:HTTP头/Cookie过大 一.NG ...
- PJSIP视频卡顿的原因以及解决办法
PJSIP视频卡顿的原因以及解决办法 现象:网络状况很好,没有丢包,视频也不会花屏,但是不流畅卡顿很厉害,这个时候作为用户是崩溃的. 分析:花屏和卡顿两个现象是不一样的原因造成. 1.花屏是解码宏块出 ...
最新文章
- Silverlight OA源代码(Silverlight4+SQLServer2005)
- Spring Cloud 系列之 Nacos 配置中心
- 浙大三维视觉团队提出Animatable NeRF,从RGB视频中重建可驱动人体模型 (ICCV'21)
- Mavlink 协议硬解析主要代码
- scrapy commandline
- python string length_自学Python:第四篇字符串
- vue+webpack实践
- centos gradle 安装
- Apache Dubbo的使用
- 【asp】aspUpload
- 怎样利用计算机随机分组,随机分组编制方法哪家强
- element-plus日期选择器 value-format出错
- java 新浪短链接_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java | 学步园...
- complex函数python_Python中complex函数有什么用?
- 产品经理一定要知道的iOS App推送显示样式
- C#医院门诊会员管理系统源码 通用会员系统源码
- 03.规格及模板管理
- 英语词组的日常积累(有点长,接近300个)
- Python玩微信头像组字
- Echarts社区 资源库