zoukankan      html  css  js  c++  java
  • SimpleDateFormat与DateTimeFormatter线程安全问题

    SimpleDateFormat与DateTimeFormatter线程安全问题,参考阿里巴巴Java开发手册规范处理

    阿里巴巴开发手册中这样说的

    20210716092541

    多线程环境下:

    public class MainClass {
    
        private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        public static String formatDate(Date date) {
            return sdf.format(date);
        }
    
        public static Date parse(String strDate) throws ParseException {
            return sdf.parse(strDate);
        }
    
        public static void main(String[] args) throws InterruptedException {
            ExecutorService service = Executors.newFixedThreadPool(100);
            for (int i = 0; i < 20; i++) {
                service.execute(() -> {
                    try {
                        System.out.println(parse("2019-04-03 17:45:00"));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
    
                });
            }
            service.shutdown();
            service.awaitTermination(1, TimeUnit.DAYS);
    
        }
    }
    
    

    输出情况:部分线程获取失败

    image-20210716093350061

    原因:把SimpleDateFormat定义为静态变量,多线程环境下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间,就会出现时间差异和其他各种问题

    SimpleDateFormat和它继承的DateFormat都不是线程安全的

    解决

    使用JDK1.8的DateTimeFormatter

    public class MainClass {
    
        private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    
        public static String formatDate(LocalDateTime date) {
            return formatter.format(date);
        }
    
        public static LocalDateTime parse(String dateNow) throws ParseException {
            return LocalDateTime.parse(dateNow, formatter);
        }
    
        public static void main(String[] args) throws InterruptedException {
            ExecutorService service = Executors.newFixedThreadPool(100);
            for (int i = 0; i < 20; i++) {
                service.execute(() -> {
                    try {
                        System.out.println(parse(formatDate(LocalDateTime.now())));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
    
                });
            }
            service.shutdown();
            service.awaitTermination(1, TimeUnit.DAYS);
        }
    }
    
    

    因此进制在多线程的情况下使用SimpleDateFormat,多线程情况应该使用DateTimeFormatter

    阿里JAVA开发手册地址

    手册阿里云盘链接:https://www.aliyundrive.com/s/MEtW4t5DdGh
    ————————————————
    版权声明:本文为CSDN博主「原棵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_44750617/article/details/118785407

  • 相关阅读:
    updatepanel,linkbutton一点问题
    URL编码处理
    习惯
    style.display,有点问题
    [转]Atlas goes M2.2 or June CTP
    贴代码——从泛型数组中递归删除不符合要求的项
    做好项目,思想要不得
    关于MemoryStream类
    DateTimePicker控件的使用
    Console“自服务”读取文件
  • 原文地址:https://www.cnblogs.com/tangliMeiMei/p/15475871.html
Copyright © 2011-2022 走看看