SimpleDateFormat ThreadSafe建议 - >创建新对象更好还是ThreadLocal?

时间:2014-10-09 06:48:35

标签: java multithreading simpledateformat thread-local

我正在构建一个我必须格式化日期的应用程序。格式化我正在使用

SimpleDateFormatter class.

据我所知,有三种方法可以将此类用于同步

1)使用

创建局部变量
 new SimpleDateFormatter("MM/dd/yyyy")

2)使用synchronized关键字

synchronized(this) {
      simpleDateFormatter.format(date); //use static object and then format with synchronization
}

3)将线程局部变量与Simple Date Formatter一起使用,如下所示

private static ThreadLocal<SimpleDateFormat> outDateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
    return new SimpleDateFormat("MM/dd/yyyy");
}

我正在构建Web应用程序,在那里我可以收到多个请求,并且在某些时候我将格式化日期。

现在我知道如果我必须在同一个线程中多次格式化,那么ThreadLocal将是更好的选择。

但是根据当前情况,每个线程都会将日期格式化一次。

Question-&GT;整个问题归结为这种情况。什么是更好的选择1或3,因为选项2将有性能问题。

因为我只需要格式化一次,

---------&GT;选项1和选项3是相同的吗?如果不是,哪一个在我的情况下更好?

------&GT;是否有任何其他方法使其线程安全,不会有性能或内存问题(如在ThreadLocal的情况下读取)。

我愿意接受建议。请分享您的意见。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

如果您的情况是单个线程只需要将日期格式化一次,那么ThreadLocal没有意义,您可以每次都简单地创建新对象。

由于对象正在创建这种情况,在这种情况下使用ThreadLocal将是昂贵的并且可能存在内存问题。我的建议 - &gt;去寻找新的对象。

我认为你对同步是正确的,因为它会阻塞线程,因为你必须处理每秒大约10,000的大量请求。

另一个选择是使用@Duncan建议的Apache Commons Lang的FastDateFormat类。

希望这是你正在寻找的答案......

答案 1 :(得分:0)

SimpleDateFormatter是一个相当轻量级的构造。根据{{​​1}}上用于解析和格式化的调用量,如果使用use synchronized并共享单个实例,那么最终会有大量被阻塞的线程。

创建新实例并在需要时使用它会更好更容易。