java8 function 多线程安全_Java8新特性_传统时间格式化的线程安全问题
1、Java8之前日期的痛点
1、构造年的日期需传入year-1900
2、每周的日期从周一开始,不符合各国用户习惯
3、 TimeZone提供时区支持但不好用,且线程不安全
4、日期格式化规划混乱,不应该在java.text包中
2、Java8中的改变
1、日期规划到了同一个包中:java.time.*
2、日期表示很灵活,可读性高
3、解决了线程安全问题
3、线程安全问题体现在哪里?
参见TestSimpleDateFormat
传统方式如何解决?
通过ThreadLocal
4、源码
TestSimpleDateFormat
package com.atguigu.java8;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestSimpleDateFormat {
public static void main(String[] args) throws Exception {
/*SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Callable task = new Callable() {
@Override
public Date call() throws Exception {
return sdf.parse("20161121");
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();*/
//解决多线程安全问题
/*Callable task = new Callable() {
@Override
public Date call() throws Exception {
return DateFormatThreadLocal.convert("20161121");
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();*/
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
Callable task = new Callable() {
@Override
public LocalDate call() throws Exception {
LocalDate ld = LocalDate.parse("20161121", dtf);
return ld;
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();
}
}
DateFormatThreadLocal
package com.atguigu.java8;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatThreadLocal {
private static final ThreadLocal df = new ThreadLocal(){
protected DateFormat initialValue(){
return new SimpleDateFormat("yyyyMMdd");
}
};
public static final Date convert(String source) throws ParseException{
return df.get().parse(source);
}
}
java8 function 多线程安全_Java8新特性_传统时间格式化的线程安全问题相关推荐
- java8 stream 做累加_Java8新特性之Stream(上)|乐字节
上次给大家介绍了Java8新特性之方法引用,大家可以点击回顾下.接下来小乐继续给大家带来Java8新特性之Stream ,流是Java8最重要的内容,小乐准备分上下两部分介绍,今天是上部. 5.1.什 ...
- java8 lambda map排序_Java8新特性第3章(Stream API)
转载请注明出处:https://zhuanlan.zhihu.com/p/20540202 Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStre ...
- java8 list切片_Java8新特性_创建 Stream、流筛选与切片
package com.atguigu.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.Ite ...
- java8 重复注解_Java8新特性_重复注解与类型注解
1.总结 1.忘记注解上该写什么时,可以随意写一个注解然后点击进去参考.复制 2.默认情况下不支持重复注解,需要定义容器 3.标注注解为@Repeatable 4.若需要获取注解的值,可以通过反射获取 ...
- java+串行和并行的区别_Java8新特性_并行流与串行流
1.Java8中forkjoin框架使用更加简单了 1.7中的ForkJoin框架编码复杂且容易出错,而8中的编码则十分简单 JDK1.7时开发者需要自定义计算类,如 package com.atgu ...
- java8新特性_乐字节-Java8新特性-函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- java8新特性_Java8新特性之Date API|乐字节
大家好,我是乐字节的小乐,上篇文章讲述了<Java8新特性之Optional>,接下来,小乐将接着讲述Java8新特性之Date API 2019日历 Java8之Date API Jav ...
- java8新特性_乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- java8 stream遍历_Java8新特性:Stream流详解
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
- java8遍历数组_java8新特性,使用流遍历集合
在这篇"Java 8新特性教程"系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章"遍历.过 ...
最新文章
- 剑指offer: 面试题03. 数组中重复的数字
- 如何让插件代码同时兼容ats 5.x和ats 6.x的方法
- javascript 随机点名
- 机房收费--修改密码
- ecshop php5.4以上版本错误之preg_replace 替换成 preg_replace_callback
- 头条45K的推荐算法工程师,需要具备怎样的技能
- 学习笔记(31):Python网络编程并发编程-定时器
- docker搭建sonar服务
- WPS制作甘特图实操(带图超详细)
- 2021-4-22-Python自动化31期-day01作业答案
- 腾讯云大学大咖分享 | 自然语言处理技术(NLP)究竟能做些什么?
- c语言勾股数编程,C++勾股数公式讲解
- 4个有助于保护网站免受劫持的方法
- 竖直的ViewPager,上下滑动的ViewPager,VerticalViewPager ;
- Pulsar 社区周报|2021-07-12 ~ 2021-07-18
- 物联网智能家居需要服务器吗,智能家居设备常见的两种配网/联网方式
- 考研数据结构之查找(9.8)——练习题之使用散列函数H(k)= 3k mod 11并采用链地址法处理冲突并构造散列表及设计散列表的完整算法(C表示)
- FCS阅读笔记:良好的编程习惯
- [RK3128][Android 6.0] u-blox GPS芯片 MAX-7Q调试记录
- 一个月上3天班,年薪100万,你来不来!
热门文章
- 三周第二次课(4月3日)
- 20155226实验四
- ubuntu下安装php的curl扩展
- HCIE-Security Day18:防火墙用户管理(一)上网用户+本地认证(portal认证)
- HCIE-RS面试--STP选举原理,状态机和接口角色
- 使用CocosStudioV3.10场景导入Cocos2d-xV3.17.2
- python3 鼠标定位输入及其点击实例
- MySQL使用小技巧(二)——MySQL忘记密码怎么办
- 性能测试二八原则,响应时间2/5/8原则
- 使用DaemonSet+Taint/Tolerations+NodeSelector部署Nginx Ingress Controller