gpt4 book ai didi

java - thread local的用途和需求是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:03 25 4
gpt4 key购买 nike

我正在探索 Java 中的本地线程。我不明白为什么我们需要这门课。如果我只是简单地将一个新对象传递给每个线程执行,我可以实现相同的动机,如果我使用 initialValue() 会发生同样的事情。我只是在 initialvalue() 中为每个线程返回一个新对象。

但是假设我有两个线程,ThreadOne: A 和 ThreadTwo B。现在我希望它们拥有自己的 SimpleDateFormat 类的副本。我可以通过在 ThreadLocal 类中扭曲 SimpleDateFormat 的对象然后使用 initialValue() 来实现这一点,我可以返回新的 SimpleDateFormat("yyyyMMdd HHmm");。我可以通过创建两个新的 SimpleDateFormat 对象和 p[将每个对象分配给 ThreadOne : A. 和 ThreadTwo : B. ThreadLocal 如何帮助我实现同样的动机

问候,

最佳答案

已经有一些很好的例子了here回答你的问题。

但我试着解释第二部分:

But say i have two threads, ThreadOne: A and ThreadTwo B. Now I want them to have a copy of own of say SimpleDateFormat class. I can do this by warping the object of SimpleDateFormat in a ThreadLocal Class and then using initialValue() I can return new SimpleDateFormat("yyyyMMdd HHmm");. Same motive I can achieve by creating two new Objects of SimpleDateFormat and p[assing one each to ThreadOne : A. and ThreadTwo : B. How does ThreadLocal help me extra

通常,您需要使用某种格式来格式化日期,创建一次 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 不是线程安全的。要使其成为线程安全的,您可以使用 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() 方法的每个线程(或调用)都将在本地副本上工作,并且不会相互干扰。这给了你线程安全的行为。

关于java - thread local的用途和需求是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008906/

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