举个例子说明SimpleDateFormat线程不安全
时间: 2023-07-25 20:25:39 浏览: 86
线程安全例子
好的,举个例子来说明SimpleDateFormat线程不安全。
假设有一个多线程的程序,每个线程都需要使用SimpleDateFormat将一个日期格式化成指定的字符串格式。如果每个线程都创建一个SimpleDateFormat实例,那么这些实例是相互独立的,不存在线程安全问题。但是,如果多个线程共享同一个SimpleDateFormat实例,就可能出现线程安全问题。
例如,下面这段代码演示了多个线程共享同一个SimpleDateFormat实例的情况:
```java
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatTest implements Runnable {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void run() {
Date date = new Date();
String formattedDate = dateFormat.format(date);
System.out.println(Thread.currentThread().getName() + ": " + formattedDate);
}
public static void main(String[] args) {
DateFormatTest test = new DateFormatTest();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(test);
t.start();
}
}
}
```
在这个例子中,每个线程都共享同一个SimpleDateFormat实例。运行程序,可能会出现如下的输出:
```
Thread-0: 2021-05-01 15:42:17
Thread-4: 2021-05-01 15:42:17
Thread-5: 2021-05-01 15:42:17
Thread-3: 2021-05-01 15:42:17
Thread-2: 2021-05-01 15:42:17
Thread-8: 2021-05-01 15:42:17
Thread-9: 2021-05-01 15:42:17
Thread-1: 2021-05-01 15:42:17
Thread-6: 2021-05-01 15:42:17
Thread-7: 2021-05-01 15:42:17
```
可以看到,所有线程的输出都是相同的,这是因为SimpleDateFormat的format方法不是线程安全的,多个线程同时访问时可能会出现竞态条件,导致输出的结果不正确。
为了避免这种情况,可以将SimpleDateFormat实例声明为局部变量,或者使用ThreadLocal来保证每个线程都拥有自己的SimpleDateFormat实例。
阅读全文