首页 科技正文

山东聊城天气预报:「【一样平常开发】」记一次因使「用」Date引起的线上BUG处置

admin 科技 2020-09-19 44 1

生涯中,我们需要掌控自己<的>时间, 削减加班[,提高效率;一样平常开发中,我们需要操作时间API,保证效率、平安、稳固。现{ 在[}都2020年了,领会如何{ 在[}JDK8及以后<的>版本中更好地操控时间就很有需要,尤其是一次线上BUG<的>发生,让小明更是深有体会。

靠山

{ 在[}Java8以前,往往操控时间,我们经常 使用[<的>类库就是Date,而且会通过SimpleDateFormat类对时间举行花样化。你可知道?Date【类是一】个可变类,SimpleDateFormat类也是线程不平安<的>,(因此{ 在[}多线程<的>场景下执行花样化操作时),就会发生意想不到<的>情形。下面我们看一下 使用[DateSimpleDateFormat{ 在[}多线程下可能发生<的>问题以及 使用[LocalDateTimeDateTimeFormatter<的>方式和优势。

问题来了

多线程环境下, 使用[DateSimpleDateFormat时,若是我们将它界说为一个静态变量 使用[,虽然会制止重复建立实例, 然则会泛起个体线程获取时间失败<的>征象,我们通过代码模拟这个场景:

运行main方式,查看控制台会发现有个体线程会报java.lang.NumberFormatException‘异常’。类似下图所示:

问题剖析

接下来,我们通过查看源码进一步剖析(多图预警),{可以看到}SimpleDateFormat是直接继续<的>DateFormat类:

并重写了parse()(字符串转日期)和 format()(日期转字符串)方式,因此我们重点从这两个方式来剖析。

首先是SimpleDateFormat<的>parse()方式,该方式中建立了一个CalendarBuilder工具,

再往下看,会看到CalendarBuilder 使用[establish方式将变量calendar设值到其属性中,

![image-20200420012213545](/Users/xin/Library/Application Support/typora-user-images/image-20200420012213545.png)

calendar是父类DateFormat 类<的>共享变量[,可以被多个线程接见到

“因此”当SimpleDateFormat声明为static时,线程并不平安,多个线程同时操作接见就会抛出‘异常’。

同样地通过查看format(),我们发现format方式中有一行calendar.setTime(date);也是操作<的>该共享变量calendar,线程也是不平安<的>。

有趣<的>是,{ 在[}DateFormat源码注释上作者也已经给出醒目<的>提醒:

使用[Google翻译过来就是

‘日期花样不同步’。 建议为每个线程建立单独<的>花样实例。 若是多个线程同时接见一种花样,则必须{ 在[}外部同步该花样。

解决方案

小明有一句座右铭,方式总比问题多。我们来看几个小明以为不错<的>解决方案。

1、仅{ 在[}需要用到<的>地方建立一个新<的>实例,就没有线程平安问题。

点评:加重了建立工具<的>肩负,频仍地建立和销毁工具,消耗资源,效率较低。

2、通过synchronized解决线程平安问题;

点评:并发量大<的>时刻会对性能有影响,容易造成线程壅闭。

3、通过ThreadLocal保证线程之间变量不共享

点评:ThreadLocal可以确保每个线程都可以获得单独<的>一个SimpleDateFormat<的>工具,那么自然也就不存{ 在[}竞争问题了。就是有点大材小用。

以上就是小明能够提供<的>所有方案。{什么},都不满足?我们来看一下2020年JDK8<的>解决方案。

使用[LocalDateTime

{ 在[}Java8以后,我们有了新<的>「选择」, 使用[LocalDateTime时间类。首先,LocalDateTime{自己是线程平安<的>},其对应<的>花样化工具类DateTimeFormatter<也是线程平安<的>>,不存{ 在[}变量共享,『每一个属』性字段都用了final关键字修饰,因此每次操作后都是返回<的>copy工具。而且LocalDateTime类自己也有许多操作时间<的>API来替换传统<的>Calendar类。

基于Java8<的>DateTimeFormatter<的>解决方案,我们对之前<的>代码举行革新,多线程环境下,<运行代码>,并未发现任何‘异常’,稳固高效:

我们{可以看到}{ 在[}DateTimeFormatter源码上作者也知心<的>加注释说明,该类是不可变<的>,而且是线程平安<的>。

同理,这点我们也可以从LocalDateTime{<的>官方源码中看出}。

其他骚操作

为了让人人忘记之前 使用[Calendar操作时间<的>拙笨,我们来切实感受一下LocalDateTime给现实开发中带来<的>便利:

更多举例说明,请点击文末阅读原文

代码地址:https://github.com/WhenCoding/coder-xiaoming

总结

综上,小明推荐小伙伴们 使用[JDK8<的>LocalDateTime系列来取代Date系列,【这样做不仅能】够保证线上项目平稳运行,{而}且通过其自带<的>API‘还能操作时间’,还能提高开发效率,今晚可以不加班!

迎接人人接见我<的>小我私家博客网站:https://mynamecoder.com

,

Sunbet

www.Lfstncnynmzyhzs.com信誉来源于每一位客户<的>口碑,Sunbet<的>服务{ 在[}sunbet「行业」是出名<的>顶尖,广西禄福生态农业开发有限责任公司欢迎新老会员、代理<的>加入。

版权声明

本文仅代表作者观点,
不代表本站Allbet的立场。
本文系作者授权发表,未经许可,不得转载。

评论

精彩评论
  • 2020-09-19 00:00:59

    AllbetAPP下载欢迎进入AllbetAPP下载(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。大家看看我!求带