java8新特性_17_传统时间格式化的线程安全问题

el/2024/5/21 21:33:14

新时间日期API

以前的时间API是线程不安全的,是可变的

线程不安全

public class TestSimpleDateFormat {public static void main(String[] args) throws Exception{SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");Callable<Date> task = new Callable<Date>() {@Overridepublic Date call() throws Exception {return format.parse("20200923");}};ExecutorService pool = Executors.newFixedThreadPool(10);List<Future<Date>> result = new ArrayList<>();for (int i = 0; i <10 ; i++) {result.add(pool.submit(task));}for (Future<Date> dateFuture : result) {System.out.println(dateFuture.get());}}
}

 ThreadLocal解决线程安全问题

public class DateFormatThreadLocal {private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){@Overrideprotected DateFormat initialValue() {return new SimpleDateFormat("yyyyMMdd");}};public static Date convert(String source) throws ParseException {return df.get().parse(source);};}public class TestSimpleDateFormatThreadLocal {public static void main(String[] args) throws Exception{Callable<Date> task = new Callable<Date>() {@Overridepublic Date call() throws Exception {return DateFormatThreadLocal.convert("20200923");}};ExecutorService pool = Executors.newFixedThreadPool(10);List<Future<Date>> result = new ArrayList<>();for (int i = 0; i <10 ; i++) {result.add(pool.submit(task));}for (Future<Date> dateFuture : result) {System.out.println(dateFuture.get());}pool.shutdown();}
}

 java8新特性

public class TestSimpleDateFormatJava8 {public static void main(String[] args) throws Exception{DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");Callable<LocalDate> task = ()->{return LocalDate.parse("20200903",formatter);};ExecutorService pool = Executors.newFixedThreadPool(10);List<Future<LocalDate>> result = new ArrayList<>();for (int i = 0; i <10 ; i++) {result.add(pool.submit(task));}for (Future<LocalDate> dateFuture : result) {System.out.println(dateFuture.get());}}
}

 

多线程对日期进行处理要加锁

LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
这里写图片描述


http://www.ngui.cc/el/5281554.html

相关文章

java8新特性_18_新时期与日期API_本地时间和时间戳

Testpublic void test1(){LocalDateTime ldt LocalDateTime.now();System.out.println(ldt);LocalDateTime ldt2 LocalDateTime.of(2019, 9, 26, 21, 48);System.out.println(ldt2);//可以进行年月计算//加两年LocalDateTime ldt3 ldt.plusYears(2);System.out.println(ldt3…

java8新特性_19_新时期与日期API_时间矫正器

//TemporalAdjuster 时间矫正器Testpublic void test1(){LocalDateTime ldt LocalDateTime.now();System.out.println(ldt);//日期变为10号LocalDateTime ldt2 ldt.withDayOfMonth(10);System.out.println(ldt2);//下一个星期日LocalDateTime ldt3 ldt.with(TemporalAdjuste…

【mall-learning】06-mall整合SpringTask实现定时任务

摘要 本文主要讲解mall整合SpringTask的过程&#xff0c;以批量修改超时订单为例。SpringTask是Spring自主研发的轻量级定时任务工具&#xff0c;相比于Quartz更加简单方便&#xff0c;且不需要引入其他依赖即可使用。Cron表达式是一个字符串&#xff0c;包括6~7个时间元素&am…

几种定时器

前言 何为定时器&#xff0c;说白了就是指定一个延迟时间&#xff0c;到期执行&#xff0c;就像我们早上定的闹铃一样&#xff0c;每天定点提醒我们起床&#xff1b;当然在我们各个系统中也是无处不在&#xff0c;比如定时备份数据&#xff0c;定时拉取文件&#xff0c;定时刷…

查看虚拟机CENTOS7 的 IP 地址和命令

用于生产环境下 安装CENTOS7 太费时间&#xff0c; 研究阶段 放在虚拟机里面 是最好的选择&#xff1a; 但是安装完毕后 就出现问题 无法使用IFCONFIG &#xff1b; 毕竟 内核不一样 首先我们登录操作系统 用户名root 密码 123456 然后我们输入ip查询命名 ip addr 也…

为什么采用单线程的 Redis 也会如此之快

众所周知&#xff0c;Redis在内存库数据库领域非常地火热&#xff0c;它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。 但我们也听说了&#xff0c;Redis是单线程的&#xff0c;为什么采用单线程的Redis也会如此之快呢&#xff1f;这篇文章我们来分析一下其中的缘…

笔试题01

题目描述 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开。 输入描述: 一行字符串&#xff0c;非空&#xff0c;长度小于5000。 输出描述: 整数N&#xff0c;最后一个单词的长度。 示例1 输入 hello world 输出 5 public class LengthOfLastWord {public …

InputStream read()方法详解

在Java7中&#xff0c;InputStream被定义为一个抽象类&#xff0c;相应的&#xff0c;该类下的read()方法也是一个抽象方法&#xff0c;这也就意味着必须有一个类继承InputStream并且实现这个read方法。   查阅Java7 API&#xff0c;我们可以看到&#xff0c;在InputStream中…

笔试题03 明明的随机数

题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;N≤1000&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xff…

spring中实现基于注解实现动态的接口限流防刷

本文将介绍在spring项目中自定义注解&#xff0c;借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** 基于注解…