本文共 1311 字,大约阅读时间需要 4 分钟。
由于SimpleDateFormat在解析时间的时候,
经历了两步,Date parse() { calendar.clear(); // 清理calendar ... // 执行一些操作, 设置 calendar 的日期什么的 calendar.getTime(); // 获取calendar的时间}
分别是clear()和setTime()。
例如当线程A执行clear操作时,线程B还没有执行clear会造成两个数据一起删除,线程A和线程B, 无法准确获得数据。 解决方法有: 1.将SimpleDateFormat不设置为静态。 2.使用ThreadLocal 3.使用FastDateFormat 这个方法需要引用第三方包*线程不安全代码
package hello;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class DateFormatTest extends Thread{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");private String name;private String dateStr;private boolean flag;public DateFormatTest(String name,String dateStr,boolean flag){this.name = name;this.dateStr = dateStr;this.flag = flag;}public void run(){Date date = null;try {date = sdf.parse(dateStr);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("name:"+name +" date:"+date+ "" );}public static void main(String[] args) throws ParseException {ExecutorService exec = Executors.newCachedThreadPool();//证明其线程不安全for(int i=0;i<10;i++){exec.submit(new DateFormatTest("张三 "+i, "2015-11-12", false));exec.submit(new DateFormatTest("李四 "+i, "1990-01-2", false));}//exec.shutdown();}}
转载地址:http://nlzoi.baihongyu.com/