gpt4 book ai didi

java - 同步对 SimpleDateFormat 的访问

转载 作者:IT老高 更新时间:2023-10-28 11:38:38 25 4
gpt4 key购买 nike

SimpleDateFormat 的 javadoc 声明 SimpleDateFormat 不同步。

"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."

但是,在多线程环境中使用 SimpleDateFormat 实例的最佳方法是什么。以下是我想到的一些选项,我过去曾使用过选项 1 和 2,但我很想知道是否有更好的选择,或者这些选项中的哪一个会提供最佳的性能和并发性。

选项 1:在需要时创建本地实例

public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}

选项 2:将 SimpleDateFormat 的实例创建为类变量,但同步对其的访问。

private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}

选项 3:创建一个 ThreadLocal 来为每个线程存储不同的 SimpleDateFormat 实例。

private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}

最佳答案

  1. 创建 SimpleDateFormat 是 expensive .除非很少使用,否则不要使用它。

  2. 如果你能忍受一点阻塞,那就好了。如果 formatDate() 使用不多,请使用。

  3. 如果您重用线程(thread pool),则最快的选择。使用比 2 更多的内存,并且具有更高的启动开销。

对于应用程序 2. 和 3. 都是可行的选择。哪个最适合您的情况取决于您的用例。提防过早的优化。仅当您认为这是一个问题时才这样做。

对于将由第 3 方使用的库,我将使用选项 3。

关于java - 同步对 SimpleDateFormat 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com