最近在工作中遇到了线程安全的问题,是在一个方法中调用了静态方法解析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); } }
解决方法:
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; } }