在JDK源码中有提到:
* Date formats are not synchronized.
* It is recommended to create separate format instances for each thread.
* If multiple threads access a format concurrently, it must be synchronized
* externally.
这是java初学者很容易忽视的地方。
解决的办法就是不要用公共的spf,尤其是static,而是用自己的spf,这样防止并发问题。
并发代码示例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test extends Thread {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
static int j=9;
public static void main (String[]args) throws InterruptedException {
for (int i = 0; i < 20; i++) {
j++;
new Thread(new Runnable() {
@Override
public void run() {
Date date = null;
try {
date = sdf.parse("2007-01-"+j);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println( j +" : date: " + date);
}
}).start();
}
}
}
运行结果(每次结果不一样,有时候还会触发报错):
11 : date: Thu Jan 11 00:00:00 CST 2007
14 : date: Sun Jan 14 00:00:00 CST 2007
14 : date: Sun Jan 14 00:00:00 CST 2007
14 : date: Sun Jan 14 00:00:00 CST 2007
18 : date: Wed Jan 17 00:00:00 CST 2007
18 : date: Thu Jan 18 00:00:00 CST 2007
18 : date: Thu Jan 18 00:00:00 CST 2007
18 : date: Thu Jan 18 00:00:00 CST 2007
20 : date: Sat Jan 20 00:00:00 CST 2007
20 : date: Sat Jan 20 00:00:00 CST 2007
24 : date: Wed Jan 24 00:00:00 CST 2007
25 : date: Thu Jan 25 00:00:00 CST 2007
25 : date: Thu Jan 25 00:00:00 CST 2007
28 : date: Sun Jan 28 00:00:00 CST 2007
28 : date: Sun Jan 28 00:00:00 CST 2007
28 : date: Sun Jan 28 00:00:00 CST 2007
28 : date: Sun Jan 28 00:00:00 CST 2007
29 : date: Sun Jan 28 00:00:00 CST 2007
29 : date: Mon Jan 29 00:00:00 CST 2007
29 : date: Mon Jan 29 00:00:00 CST 2007