码迷,mamicode.com
首页 > 编程语言 > 详细

DateFormat的format()方法线程不安全的问题分析

时间:2018-03-08 02:48:58      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:了解   throw   虚拟机   imp   pre   []   for   port   import   

最近看到《侦探剧场:堆内存神秘溢出事件》https://my.oschina.net/u/2368090/blog/1628720,于是自己也想测试了解一下DateFormat的多线程安全问题。

首先先看现象:做一个多线程使用同一个SimplyDateFormat的测试例子:

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

public class DateFormatTest {

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

    public static void main(String[] args) throws Exception{

        Date start = sdf.parse("2018-03-01");
        Date end = sdf.parse("2018-03-03");

        final Date other =sdf.parse("2018-03-07");
        for(int i=0; i<100; i++) {
            new Thread(new Runnable() {
                public void run() {
                    sdf.format(other);
                }
            }).start();
        }

        System.out.println("start:" + sdf.format(start));
        System.out.println("end:" + sdf.format(end));
    }

}

(这段代码在虚拟机能很快重现问题,在Mac上要迅速不断点击运行才会重现--)

预期结果:

技术分享图片 

出现线程安全的结果:

技术分享图片

现象看完之后找原因:

1.DateFormat(父类)定义了一个全局的Calendar:

技术分享图片

SimplyDateFormat的format()方法在线程不安全的情况下使用了全局的calendar:

技术分享图片

产生问题的大致运行顺序也许是这样的:

技术分享图片

DateFormat的format()方法线程不安全的问题分析

标签:了解   throw   虚拟机   imp   pre   []   for   port   import   

原文地址:https://www.cnblogs.com/cici20166/p/8525563.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!