为什么SimpleDateFormat是线程不安全的?
因为SimpleDateFormat中有一个对象为Calendar,这个类在format中的作用就是将日期转换为字符串,而在转换过程中会涉及到一个方法:
xxx 此处省去一堆字
calendar.setTime(date);
xxxx 此处省去一堆字
该方法就是将传入的date放入calendar内,试想,如果一个线程将date放入了,然后立刻切换到另一个线程,另一个线程就会将calendar中的date覆盖。这样一来,所做的转换肯定就是不准确的啦。
SimpleDataFormat在什么情况下使用是不安全的?
1、如果实例是单例,那么SimpleDataFormat作为成员变量就是不安全的。
比如下面这个例子:
public class MyThread implements Runnable {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd,HHmmss");
@Override
public void run() {
while (true) {
try {
String date = simpleDateFormat.format(new Date(Math.abs(new Random().nextLong())));
System.out.println("日期为:" + date);
} cat