我正在构建一个我必须格式化日期的应用程序。格式化我正在使用
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的情况下读取)。
我愿意接受建议。请分享您的意见。
感谢您的时间。
答案 0 :(得分:3)
如果您的情况是单个线程只需要将日期格式化一次,那么ThreadLocal没有意义,您可以每次都简单地创建新对象。
由于对象正在创建这种情况,在这种情况下使用ThreadLocal将是昂贵的并且可能存在内存问题。我的建议 - &gt;去寻找新的对象。
我认为你对同步是正确的,因为它会阻塞线程,因为你必须处理每秒大约10,000的大量请求。
另一个选择是使用@Duncan建议的Apache Commons Lang的FastDateFormat类。
希望这是你正在寻找的答案......
答案 1 :(得分:0)
SimpleDateFormatter
是一个相当轻量级的构造。根据{{1}}上用于解析和格式化的调用量,如果使用use synchronized并共享单个实例,那么最终会有大量被阻塞的线程。
创建新实例并在需要时使用它会更好更容易。