我在我的应用程序中使用简单的日期格式,如下所示:
static SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
public static myFunction(final String strDate)
{
Date endDate = null;
endDate = MyClass.sdf.parse(strDate);
}
我正在使用FindBugs,它在上面的代码中给出了以下错误:
“正如JavaDoc所述,DateFormats对于多线程使用本质上是不安全的。检测器已经找到了一个通过静态字段获得的DateFormat实例的调用。这看起来很可疑。”
有人可以解释一下这个bug。我无法理解上面的消息试图告诉你什么。
感谢您阅读!!
答案 0 :(得分:4)
其他回答线程安全并从SimpleDateFormat之前删除静态关键字的人是正确的,尽管您在问题中发布的代码根本无法编译。
我认为这更接近您正在寻找的代码:
public static Date parseDateStr(final String dateStr) throws ParseException
{
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
return sdf.parse(dateStr);
}
答案 1 :(得分:1)
DateFormat不是线程安全的。这甚至记录在javadoc中。由于您将其声明为 static 变量,因此FindBugs知道它有可能在多个线程中使用。详细了解issue and alternatives here。
此外,您的代码不应该编译,因为Java不支持本地静态变量。 How do I create a static local variable in Java?
答案 2 :(得分:1)
从静态中移除静态SimpleDateFormat sdf = new SimpleDateFormat(“MM / dd / yyyy”);
将var保存为作用于此方法的单个静态实例。这意味着同时访问此方法的其他线程将对同一个非线程安全的实例进行dateformat调用。
答案 3 :(得分:0)
根据 Pangea 的建议继续,您可以测试下面的代码。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static Date myFunction(final String strDate) throws ParseExceptoion
{
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
return sdf.parse(strDate);
}
public static void main(String[] args) throws ParseException {
System.out.println(myFunction("05/18/1989").toString());
}
}
答案 4 :(得分:0)
我遇到了一个问题,即在eclipse之外构建JUnit测试失败(通过DOS ANT构建和测试脚本),但它在eclipse中运行得很好。
正在测试的代码是批处理作业中的一个类和方法,它将SimpleDateFormat声明为private static final。
我不关心线程安全性,因为这个批处理作业是单线程的。
我也不想每次需要时都实例化SimpleDateFormat的新实例,因为该进程处于循环处理数千个数据行。
我通过将SimpleDateFormat的声明从private static final更改为private final transient来解决它。
当然这确实意味着实例化类,这可能不适用于所有情况,但如果您实例化类并且不想每次都创建新实例并且线程安全不是问题,那么它就是一个解决方案。 / p>