请告诉代码示例为什么SimpleDateFormat不是线程安全的.这堂课有什么问题? SimpleDateFormat的格式功能有问题吗?请给出一个在课堂上演示此错误的代码.
FastDateFormat是线程安全的.为什么?b/w SimpleDateFormat和FastDateFormat有什么区别?
请用解释此问题的代码解释一下?
我们知道dateformat类不是线程安全的.我有一个多线程场景,需要使用dateformats.我无法在新线程中创建新实例,因为SimpledateFormat创建似乎很昂贵(构造函数最终调用"编译",这是昂贵的).经过一些测试,我只剩下两个选项:
有什么建议?
如果大家之前已经面对过这个问题,你会采取什么方向.
我有一个关于线程安全的问题.据我所知,SimpleDateFormat不是线程安全的.我想知道如果我在弹簧控制器中使用以下方式会有什么影响:
private final static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd yyyy", Locale.US);
Run Code Online (Sandbox Code Playgroud)
稍后在我的控制器函数中,我使用它如下:
try {
changedate = changedate.substring(0, 15);
calcDate = dateFormat.parse(changedate);
} catch (ParseException e2) {
logger.error("Date Parsing Problem", e2);
}
Run Code Online (Sandbox Code Playgroud)
然后将calcDate添加到我的模型对象中,并返回ModelAndView.
那么我会用这种方式看到什么样的问题呢?简单地删除static关键字会修复任何问题,因为每个线程都会使用自己的dateFormat实例吗?关于线程安全性的任何关于线程安全性的清晰度都将非常受欢迎.
谢谢
Synchronization
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally
Run Code Online (Sandbox Code Playgroud)
上面的行在SimpleDateFormat类的JavaDoc中提到.
这是否意味着我们不应该将SimpleDateFormat对象创建为Static.
如果我们将它创建为静态,那么无论我们在哪里使用这个对象,我们都需要将它保存在Synchronized Block中.
我在Servlet中使用了很多SimpleDateFormat对象.不幸的是,SimpleDateFormat不是线程安全的.因此,我考虑用ThreadLocal包装它以促进SimpleDateFormat对象的重用.我写了一个util-class来启用它:
public class DateUtil {
private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
return new SimpleDateFormat();
}
public static SimpleDateFormat get () {
return dateFormat.get();
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,这似乎导致内存泄漏.关闭我的webapp时,Tomcat会记录以下错误消息:
严重:Web应用程序[]使用[null]类型的键创建了一个ThreadLocal(值[com.example.util.DateUtil$2@50242f7d]),类型为[java.text.SimpleDateFormat](value [java.text] .SimpleDateFormat @ d91b489b])但在Web应用程序停止时无法将其删除.这很可能造成内存泄漏.
我理解内存泄漏的原因,但是在Servlet中处理SimpleDateFormat-objects(或任何其他非线程安全对象)的最佳方法是什么?