当前位置: 首页 > news >正文

SimpleDateFormat 线程不安全案例

SimpleDateFormat 线程不安全案例:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Test1 {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        Integer count = 10;

        Callable<Object> callable = new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                // 线程不安全
                return sdf.parse("2019-03-27");
            }
        };

        List<Future<Object>> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            Future<Object> future = executorService.submit(callable);
            list.add(future);
        }
        for (Future<Object> future : list) {
            System.out.println(future.get());
        }

        executorService.shutdown();
    }

}

使用ThreadLocal解决SimpleDateFormat的线程不安全问题

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class DateFormatThreadLocal {

    private static final ThreadLocal<DateFormat> simpleDateFormat = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

    public static Date convert(String str) throws ParseException {
        return simpleDateFormat.get().parse(str);
    }

}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Test2 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        Integer count = 10;

        Callable<Object> callable = new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                return DateFormatThreadLocal.convert("2019-03-27");
            }
        };

        List<Future<Object>> list = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            Future<Object> future = executorService.submit(callable);
            list.add(future);
        }
        for (Future<Object> future : list) {
            System.out.println(future.get());
        }

        executorService.shutdown();
    }


}

相关文章:

  • BPEL和JAVA(一篇不错的BPEL入门)
  • 关于 BlockingQueue 的一些认识及资料汇总
  • 欣闻我班上的学生林健在Image Cup比赛中取得好成绩
  • C#.NET常用函数大全
  • Java基本类型简介
  • 动态调用 WebService
  • 关于 ThreadPoolExecutor 的一些资料汇总及个人认识
  • ADO.NET数据操作摘录
  • 线程池ThreadPoolExecutor的拒绝策略
  • 关于 ScheduledThreadPoolExecutor 的一些资料汇总及个人理解
  • 无聊的事情真多
  • 转载一篇关于JNI实践的博客---以及编写自己的native方法
  • 竞标项目,何必这样呢?
  • 关于Netty的一点初步认识
  • 骨干跳槽让系统成鸡肋 IT主管如何是好
  • Docker: 容器互访的三种方式
  • express.js的介绍及使用
  • Git 使用集
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • jdbc就是这么简单
  • Joomla 2.x, 3.x useful code cheatsheet
  • nfs客户端进程变D,延伸linux的lock
  • Node + FFmpeg 实现Canvas动画导出视频
  • QQ浏览器x5内核的兼容性问题
  • Redis 中的布隆过滤器
  • Shadow DOM 内部构造及如何构建独立组件
  • springboot_database项目介绍
  • SQLServer之索引简介
  • 入门到放弃node系列之Hello Word篇
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • UI设计初学者应该如何入门?
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ###C语言程序设计-----C语言学习(3)#
  • %check_box% in rails :coditions={:has_many , :through}
  • (2)STM32单片机上位机
  • (笔试题)分解质因式
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Google的Objective-C编码规范
  • (转)linux下的时间函数使用
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *2 echo、printf、mkdir命令的应用
  • .NET Core WebAPI中封装Swagger配置
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/sudoers (root权限管理)
  • @NestedConfigurationProperty 注解用法
  • @Not - Empty-Null-Blank
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [Angular] 笔记 20:NgContent