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

案例(2)-- 线程不安全对象(SimpleDateFormat)

时间:2019-08-14 12:32:51      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:dig   rac   get   方便   stack   定位   str   star   mat   

问题描述:

  1、系统偶发性抛出异常:java.lang.NumberFormatException: multiple points ,追溯源头抛出的类为:SimpleDateFormat

问题的定位:

  1、总所周知,SimpleDateFormat是非线程安全的类。由此可以推断:在多线程环境下,需要同步使用。

  2、模拟异常的发生: 

重现错误代码示例:

public class ThreadSafe {

  public static void main(String[] args) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    new Thread(new MyThread1(sdf,"1991-06-10 10:21:10"),"a").start();
    new Thread(new MyThread1(sdf,"1991-07-10 17:21:19"),"b").start();
    new Thread(new MyThread1(sdf,"1989-11-19 15:31:40"),"b").start();
    new Thread(new MyThread1(sdf,"1999-08-12 13:41:40"),"b").start();
    new Thread(new MyThread1(sdf,"2019-06-10 10:23:10"),"b").start();
    new Thread(new MyThread1(sdf,"1990-06-10 55:55:55"),"b").start();
    new Thread(new MyThread1(sdf,sdf.format(new Date())),"b").start();
  }
}
class MyThread1 implements Runnable{
  SimpleDateFormat sdf;
  String dateStr;

  public MyThread1(SimpleDateFormat sdf,String dateStr) {
    this.sdf = sdf;
    this.dateStr = dateStr;
  }

  @Override
  public void run() {
    while (true){
      try {
        String format = sdf.format(new Date());
        Date parse = sdf.parse(format);
        System.out.println(format+","+parse+","+Thread.currentThread().getName());
      }catch (Exception error){
        error.printStackTrace();
        System.exit(-1); //为了方便查看日志,停掉整个进程
      }
    }
  }
}

完整的异常堆栈信息如下:

java.lang.NumberFormatException: multiple points
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.lang.Double.parseDouble(Double.java:538)
	at java.text.DigitList.getDouble(DigitList.java:169)
	at java.text.DecimalFormat.parse(DecimalFormat.java:2056)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)

问题的解决:  

   1、将 SimpleDateFormat 结合 ThreadLocal 构建工具类,使得一个线程,专属一个 SimpleDateFormat 。

   2、工具类示例代码如下:

    (暂缺)    

   

案例(2)-- 线程不安全对象(SimpleDateFormat)

标签:dig   rac   get   方便   stack   定位   str   star   mat   

原文地址:https://www.cnblogs.com/chen--biao/p/11351093.html

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