多线程调用static方法线程安全问题

最近在工作中遇到了线程安全的问题,是在一个方法中调用了静态方法解析Date的字符串。

因为 SimpleDateFormat这个类是线程不安全的,所以不能在静态方法中定义全局的成员变量。

@Test
void contextLoads() {
    ExecutorService executorService= Executors.newFixedThreadPool(6);
    for (int i = 0; i < 6; i++) {
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                Date date= DateUtil.ParseDate("20210501");
                System.out.println("子线程"+Thread.currentThread().getName()+date);
            }
        };
        executorService.execute(runnable);
    }
  
}

 多线程调用static方法线程安全问题

 解决方法:

1.使用synchronized来保证线程安全。

2.把全局变量换为使用成员变量。

public class DateUtil {
    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
//    public static synchronized   Date ParseDate(String str){
    public static  Date ParseDate(String str){
        try {
            SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
            return sf.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}
上一篇:golang API 请求队列


下一篇:SimpleDateFormat类