对于您的问题,这里已经有一些很好的例子。
但我尝试解释第二部分:
但是假设我有两个线程,ThreadOne:A 和 ThreadTwo B。现在我希望他们拥有自己的 SimpleDateFormat 类的副本。我可以通过在 ThreadLocal 类中扭曲 SimpleDateFormat 的对象然后使用 initialValue() 我可以返回 new SimpleDateFormat("yyyyMMdd HHmm"); 来做到这一点。我可以通过创建两个 SimpleDateFormat 的新对象并将 [每个传递一个给 ThreadOne 来实现相同的动机:A. 和 ThreadTwo :B. ThreadLocal 如何帮助我额外
通常,您需要以某种格式格式化日期,并且创建一次对象当然是一个好主意(而不是每次需要格式化日期时都SimpleDateFormat
创建一个新对象)。SimpleDateFormat
所以你可能有这样的事情:
public class DateUtils {
private final static DateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");
public String formatDate(Date date) {
return dateFormat.format(date);
}
}
如果多个线程同时调用,这将失败formatDate(...)
(您可能会得到奇怪的输出或exceptions
),因为SimpleDateFormat
is not Thread-Safe
. 为了使其线程安全,您可以使用ThreadLocal
:
public class DateUtils {
private final ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("dd-mm-yyyy");
}
};
public String formatDate(Date date) {
return dateFormat.get().format(date);
}
}
现在每个对 formatDate() 方法的线程(或调用)都将在本地副本上工作,并且不会相互干扰。这为您提供了线程安全的行为。