【发布时间】:2014-10-09 06:48:34
【问题描述】:
我正在构建一个应用程序,我必须在其中格式化日期。对于格式化,我正在使用
SimpleDateFormatter class.
据我所知,有三种方法可以通过同步来使用这个类
1) 使用
创建局部变量 new SimpleDateFormatter("MM/dd/yyyy")
2) 使用同步关键字
synchronized(this) {
simpleDateFormatter.format(date); //use static object and then format with synchronization
}
3) 像这样使用带有简单日期格式化程序的线程局部变量
private static ThreadLocal<SimpleDateFormat> outDateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("MM/dd/yyyy");
}
我正在构建 Web 应用程序,我可以在其中接收多个请求,并且在某些时候我将格式化日期。
现在我知道,如果我必须在同一个线程中多次格式化,那么 ThreadLocal 会是更好的选择。
但根据当前情况,每个线程都会格式化一次日期。
问题-> 整个问题归结为情况。什么是更好的选项 1 或 3,因为选项 2 会有性能问题。
因为我只需要格式化一次,
---------> 选项 1 和选项 3 相同吗?如果不是,我的情况下哪个更好?
-----> 有没有其他方法可以使它成为线程安全的,不会出现性能或内存问题(在 ThreadLocal 的情况下读取)。
我愿意接受建议。请分享您的意见。
感谢您的宝贵时间。
【问题讨论】:
-
另一种方法是使用 Apache Commons Lang 的
FastDateFormat类,它是SimpleDateFormatter的线程安全版本。 -
谢谢,我想这是一个更好的选择。
-
保持简单,只需在需要时创建一个新实例。我怀疑这会导致任何性能问题。
-
我必须每秒处理大约 10,000 个请求。由于 SimpleDateFormatter 的对象创建不是那么轻,它肯定会对性能产生影响
-
@ParasMittal 我会鼓励一种比这更轻松的方法。请记住前两个优化规则。只需编写程序的其余部分,并且仅当生成的应用程序太慢时并且您以后可以确定这部分代码是最慢的,然后再考虑一下。
标签: java multithreading simpledateformat thread-local