nit*_*.kk 7 java multithreading thread-local
我在Java中探索Thread本地.我无法理解为什么我们需要这门课.如果我只是简单地将一个新对象传递给每个线程来执行,我可以实现相同的动机,如果我使用initialValue()就会发生同样的事情.我只是在initialvalue()中为每个线程返回一个新对象.
但是说我有两个线程,ThreadOne:A和ThreadTwo B.现在我希望他们拥有自己的SimpleDateFormat类的副本.我可以通过在ThreadLocal类中扭曲SimpleDateFormat的对象然后使用initialValue()来执行此操作,我可以返回新的SimpleDateFormat("yyyyMMdd HHmm");. 同样的动机我可以通过创建两个新的SimpleDateFormat对象来实现,并且[每个都向ThreadOne提供一个:A.和ThreadTwo:B.ThreadLocal如何帮助我额外的
问候,
对于您的问题,这里已经有一些很好的例子。
但我试着解释第二部分:
但是假设我有两个线程,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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果多个线程同时调用formatDate(...)
(您可能会得到奇怪的输出或exceptions
),这将失败,因为SimpleDateFormat
不是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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在对 formatDate() 方法的每个线程(或调用)都将在本地副本上工作,并且不会相互干扰。这为您提供了线程安全的行为。
您将用于ThreadLocal
将“数据”传递给特定线程。
例如,您有一个方法,doSomething(SomeObject a, SomeOtherObject b);
您可以通过线程局部变量以线程安全的方式向该方法传递特定执行线程的更多信息,而不仅仅是a
和b