SimpleDateFormat线程不安全

来源:互联网 发布:淘宝嘉年华羽绒服女 编辑:程序博客网 时间:2024/06/05 18:53

由于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();}}
0 0
原创粉丝点击